自从读过Android内核剖析这本书之后,对整个安卓的系统有了更深的认识和理解,前面写了3篇文章(深入PMS源码)分析了PMS的相关代码,之后会将相关知识都整理在博客上,本篇开始将从源码角度分析AMS的执行逻辑,AMS作为Android的核心服务,了解其内部流程会让开发者对程序的执行有更深刻的认识,主要的流程逻辑放在下一篇中分析,这里先分析下基础部分便于更好的理解之后的内容;
1、AMS重要数据结构
- Activity栈模型

- 每个活动Activity在AMS中都会创建对应的ActivityRecord对象;
- 这些ActivityRecord对象被管理在各自的任务栈中,每个TaskStack可以添加多了任务对象;
- 所有的TaskStack都被ActivityStack统一管理,负责TaskStack的顺序、入栈和出栈;
- ActivityRecord:记录所有Activity的信息,属性如下:
- service:ActivityManagerService的引用
- info:Activity注册的全部信息
- appInfo:此活动对应的应用程序信息
- launchedFromPackage:启动此Activity程序对应的包名
- app:所在进程信息ProcessRecord对象
- launchMode:启动模式
- task:此Activity所属的任务栈,TaskRecord
- taskAffinity:Activity设置的归属栈名称
- packageName:包含Activity的包名
- processName:程序的进程名称
- userId:当前活动运行所在的用户ID
- ActivityRecord resultTo:此活动需要回复数据的ActivityRecord对象
- requestCode:请求的状态码
- Bundle icicle:保存Activity的数据
- state:Activity的当前状态
- icon:应用程序图标Icon
- logo:应用程序图标Logo
- theme:应用程序图标theme
- labelRes:应用程序图标labelRes
- TaskRecord:Activity所属的任务栈
- AMS中使用任务栈记录每个Activity的状态和启动顺序,使每个Activity都有各自的任务栈,在执行启动和退出时可以在栈中有序进行;
- 默认A启动新的ActivityB,那新的B就加入A所在的任务栈中;
- TaskRecord属性:
- taskId:任务栈的Id,唯一标志
- affinity:任务栈的倾向性名称
- intent:启动这个栈的Intent意图
- userId:此栈所属的用户ID
- mActivities:任务栈中所有的Activity信息
- mStack:当前的栈所属的管理类ActivityStack对象
- mService:保存AMS引用
- ActivityStack:Activity的栈管理类,管理进程中所有的TaskRecord对象
- mService:AMS引用
- mWindowManager:WMS引用
- ArrayList mTaskHistory:所有的活动历史记录栈,集合中最顶的栈为当前栈
- mLRUActivities:保存最近最少使用的活动
- mPausingActivity:保存正在暂停的Activity
- mLastPausedActivity:最近一个已经Paused状态的活动
- mResumedActivity:当前正在运行的活动
- mLastNoHistoryActivity:最近一个NoHistory的活动
- mStackId:栈管理的id
- mHandler:ActivityStackHandler对象,执行Handler消息事件
2、AMS的启动过程
AMS作为系统的主要服务,也是在Android系统启动后由系统来启动,由Android系统启动过程知道系统启动服务通过SystemServer完成,在SystemServer中调用startBootstrapServices()启动核心服务,AMS也是在此方法中完成启动
private void startBootstrapServices() {
559 mActivityManagerService = mSystemServiceManager.startService(
560 ActivityManagerService.Lifecycle.class).getService(); //1、使用SystemServiceManager创建AMS对象
561 mActivityManagerService.setSystemServiceManager(mSystemServiceManager); //赋值AMS中mSystemServiceManager
562 mActivityManagerService.setInstaller(installer); //赋值AMS中的installer
}
上面的代码也是在Android系统启动过程中出现过的,使用SystemServiceManager.startService()方法,传入ActivityManagerService.Lifecycle.class启动服务,由前面的学习知道startService()方法中会创建Lifecycle对象,并调用onStart()方法
public static final class Lifecycle extends SystemService {
private final ActivityManagerService mService;
public Lifecycle(Context context) {
super(context);
mService = new ActivityManagerService(context); // 1、创建AMS对象
}
@Override
public void onStart() {
mService.start(); // 2、执行start()方法
}
public ActivityManagerService getService() {
// 3、返回AMS对象
return mService;
}
}
在Lifecycle的构造函数中直接创建ActivityManagerService对象,然后调用ActivityManagerService.start()方法
- ActivityManagerService构造函数
public ActivityManagerService(Context systemContext) {
mSystemThread = ActivityThread.currentActivityThread(); // 1、获取ActivityThread实例
mHandlerThread = new ServiceThread(TAG, THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);
mHandlerThread.start();
mHandler = new MainHandler(mHandlerThread.getLooper()); // 2、使用HandlerThread初始化一个线程和Handler对象
mProcStartHandlerThread = new ServiceThread(TAG + ":procStart”, // 3、初始化用于进程启动的ProcStartHandle对象
THREAD_PRIORITY_FOREGROUND, false /* allowIo */);
mProcStartHandlerThread.start();
mProcStartHandler = new Handler(mProcStartHandlerThread.getLooper());
if (sKillHandler == null) {
sKillThread = new ServiceThread(TAG + ":kill",
THREAD_PRIORITY_BACKGROUND, tru

本文从源码角度探讨Android的ActivityManagerService(AMS),首先介绍了AMS的重要数据结构,如ActivityStack、TaskRecord和ActivityStack管理。接着详细阐述了AMS的启动过程,包括由SystemServer启动并在ActivityManagerService.start()方法中完成初始化。最后,简述了AMS如何管理Activity的生命周期,使用模板模式执行生命周期回调。下篇将继续分析AMS如何调度Activity。
——ActivityManagerService的基础知识&spm=1001.2101.3001.5002&articleId=102818180&d=1&t=3&u=1e8a459217ee4362913fa010e3a9b308)
2872

被折叠的 条评论
为什么被折叠?



