1.概述
ActivityTaskManagerService(以下简称ATMS)是Android 10新增加的系统服务类,承担了ActivityManagerService(AMS)的部分工作(activities、task, stacks, displays相关),比如将Activity的启动相关的调用转移到了ATMS中。以下源码基于Android 11,并对ATMS进行简单介绍。
2.ATMS的启动过程
ATMS启动的时序图如下所示:
ATMS和AMS、PMS一样,也是在SystemServer中的startBootstrapServices中创建,部分代码如下:
/frameworks/base/services/java/com/android/server/SystemServer.java
public final class SystemServer {
...
//启动引导服务
startBootstrapServices(t);
//启动核心服务
startCoreServices(t);
//启动其他服务
startOtherServices(t);
...
private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
...
//1
ActivityTaskManagerService atm = mSystemServiceManager.startService(
ActivityTaskManagerService.Lifecycle.class).getService();
mActivityManagerService = ActivityManagerService.Lifecycle.startService(
mSystemServiceManager, atm);
...
}
}
在注释1处,主要是通过SystemServiceManager.startService来创建并获取ActivityTaskManagerService实例,并作为参数传入AMS。 SystemServiceManager部分相关代码如下:
/frameworks/base/services/core/java/com/android/server/SystemServiceManager.java
public class SystemServiceManager {
...
private final ArrayList<SystemService> mServices = new ArrayList<SystemService>();
...
public <T extends SystemService> T startService(Class<T> serviceClass) {
Constructor<T> constructor = serviceClass.getConstructor(Context.class);
service = constructor.newInstance(mContext);
...
startService(service);
return service;
}
public void startService(@NonNull final SystemService service) {
// Register it.
mServices.add(service);
// Start it.
long time = SystemClock.elapsedRealtime();
try {
service.onStart();
}
...
}
}
在SystemServiceManager.startService内部通过Constructor构造器创建并且初始化ActivityTaskManagerService.Lifecycle实例,Lifecycle内部会创建ATMS实例,最终调用Lifecycle的onStart方法。startService方法返回Lifecycle实例并通过getService()获取到了ATMS实例。
ActivityTaskManagerService.Lifecycle为ATMS的内部类:
public static final class Lifecycle extends SystemService {
private final ActivityTaskManagerService mService;
public Lifecycle(Context context) {
super(context);
mService = new ActivityTaskManagerService(context);
}
@Override
public void onStart() {
publishBinderService(Context.ACTIVITY_TASK_SERVICE, mService);
mService.start();
}
...
public ActivityTaskManagerService getService() {
return mService;
}
}
内部类Lifecycle继承了SystemService,在构造函数中创建了ActivityTaskManagerService对象,并在onStart()中调用SystemService的publishBinderService将ATMS注册到ServiceManager中并调用ATMS的start方法。
3.初始化函数initialize()
在AMS的构造函数中会调用ATMS的initialize()方法
/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
...
public ActivityManagerService(Context systemContext, ActivityTaskManagerService atm) {
...
mActivityTaskManager = atm;
//调用STMS的initialize,并传入Display线程的Looper
mActivityTaskManager.initialize(mIntentFirewall, mPendingIntentController,
DisplayThread.get().getLooper());
...
}
initialize()方法会初始化一些对象实例,比如ActivityStackSupervisor、ActivityStartController等,会涉及到Activity的启动以及Activiy栈的一些逻辑,代码如下:
public void initialize(IntentFirewall intentFirewall, PendingIntentController intentController,
Looper looper) {
...
//1
mStackSupervisor = createStackSupervisor();
mTaskChangeNotificationController =
new TaskChangeNotificationController(mGlobalLock, mStackSupervisor, mH);
mLockTaskController = new LockTaskController(mContext, mStackSupervisor, mH);
//2
mActivityStartController = new ActivityStartController(this);
setRecentTasks(new RecentTasks(this, mStackSupervisor));
mVrController = new VrController(mGlobalLock);
mKeyguardController = mStackSupervisor.getKeyguardController();
}
注释1处创建了ActivityStackSupervisor,ActivityStackSupervisor负责管理ActivityStack;
注释2处创建ActivityStartController,并将ATMS自身传入。ActivityStartController主要负责Activity启动的相关工作。例如在startActivityAsUser通过getActivityStartController().obtainStarter(...)获取到ActivityStarter并执行后续的启动工作。