这篇文章主要讲的跟ActivityManagerService相关的类的简单说明(都是本人的理解,可能存在错误),大概弄清这里类代表的是什么作用是什么,对于我们梳理startActivity的流程会更加容易清晰。
目录
1、ActivityThread和ApplicationThread(内部类)、H(内部类)
8、ActivityStack、 TaskRecord、 ActivityRecord
1、ActivityThread和ApplicationThread(内部类)、H(内部类)
ActivityThread管理主线程中的执行申请流程,安排和执行activity,作为活动进行广播和其他操作经理要求
ApplicationThread是ActivityThread,主要用于和AMS的跨进程通信。可以这样大致理解,通过调用ActivityManager.getService()的方法,我们可以向AMS申请开始一个新的Activity,AMS通过我们传过ApplicationThread.asBinder()把处理完的结果返回到我们的主线程,完成整个跨进程通信的过程。
H继承于Handler 用于管理ActivityThread的核心功能
2、Instrumentation
谷歌的说明就是,实现应用程序检测代码的基类。(自动化测试会自动这个类,这部分我也没怎么去了解)
但是这个类和Activity的关系比较密切,Activity生命周期相关方法的调用都通过这个类去执行,我们可以通过类去追踪。
3、ActivityManagerService
这个就是我们的主角,AMS进程,主要负责创建Activity以及管理其生命周期。
AMS进程的入口和ActivityThread进程不太一样,入口不是从main方法开始
// ActivityManagerService.java
public static final class Lifecycle extends SystemService {
private final ActivityManagerService mService;
public Lifecycle(Context context) {
super(context);
mService = new ActivityManagerService(context);
}
@Override
public void onStart() {
mService.start();
}
@Override
public void onBootPhase(int phase) {
mService.mBootPhase = phase;
if (phase == PHASE_SYSTEM_SERVICES_READY) {
mService.mBatteryStatsService.systemServicesReady();
mService.mServices.systemServicesReady();
}
}
@Override
public void onCleanupUser(int userId) {
mService.mBatteryStatsService.onCleanupUser(userId);
}
public ActivityManagerService getService() {
return mService;
}
}
在构建SystemServer进程时,在main()方法中创建
4、ActivityStarter
这个类主要用于启动一个activity,该activity相应的启动flag解析和任务栈管理都在这个类中处理
5、ActivityStartController
负责管理ActivityStater,启动activity的工作主要还是由ActivityStater负责。
6、ClientLifecycleManager
这个类连接着AMS进程和app进程(ActivityThread),AMS通过这个类,将相应的Activity事务和生命周期的状态回调到相应的ActivityThread去处理。例如,Activity之间的切换,当前Activity转换到onPause状态,新开的Activity开始创建,调用onCreate方法,以及该Activity变为可见,转换到onResume状态。都是由AMS进行管理,通过ClientLifecycleManager分发到对应的ActivityThread,再到具体Activity去执行对应的生命周期的方法。
7、抽象类ClientTransactionItem
代表这一个Activity事务,通过它的子类就大概可以猜得出,AMS和Activity相关生命周期的关系了
8、ActivityStack、 TaskRecord、 ActivityRecord
它们的大概关系是一个ActivityStack有一个TaskRecord集合,每一个TaskRecord有一个ActivityRecord集合。
它们分别是:
ActivityRecord代表一个Activity
TaskRecord代表一个Activity任务栈
ActivityStack管理着多个Activity任务栈(注意不是每个应用分别拥有一个独立的ActivityStack,所以不能理解成一个ActivityStack代表这一个应用)
9、ActivityDisplay
代表的是一个显示器,在一个ActivityDisplay有一个ActivityStack集合,集合存放特定类型的ActivityStack,所以到这里就可以理解,为什么一个屏幕的显示是由多个Activity拼起来的。
10、KeyguardController
键盘管理器,控制键盘的遮挡,关闭和过渡
11、RecentTasks
代表最近任务列表
12、ProcessRecord
一个ProcessRecord对应着一个进程信息
13、ResolveInfo
对应着该Activity在AndroidManifest配置的信息
备注:在AMS源码的中的方法命名习惯
1、xxxxLocked()代表着该方法是在同步代码块内执行,保证了同步性
2、xxxxUnchecked()代表该方法内不检查相关状态,在调用该方法之前会存在检查相关状态的代码
3、isxxxx()、canxxxx()、checkxxxx()代表着该方法用于判断某种状态
4、xxxxIfNeeded()代表着该方法执行是在if判断里面的
(发现看一圈源码,还学到一点大神们怎么对方法名的管理)