启动
在Android系统启动流程中中我们提到过,AMS是在system_service中启动的,
//frameworks/base/services/java/corri/android/server/SystemServer.java
//该方法主要启动服务 ActivityManagerService,PowerManagerService,LightsService,DisplayManagerService,PackageManagerService,UserManagerService。
//设置 ActivityManagerService,启动传感器服务。
startBootstrapServices(); // 启动引导服务
//该方法主要
//启动服务 BatteryService 用于统计电池电量,需要 LightService。
//启动服务 UsageStatsService,用于统计应用使用情况。
//启动服务 WebViewUpdateService。
startCoreServices(); // 启动核心服务
//该方法主要启动服务 InputManagerService,WindowManagerService。
//等待 ServiceManager,SurfaceFlinger启动完成,然后显示启动界面。
//启动服务 StatusBarManagerService,
//准备好 window, power, package, display 服务:
//- WindowManagerService.systemReady()
//- PowerManagerService.systemReady()
//- PackageManagerService.systemReady()
//- DisplayManagerService.systemReady()
startOtherServices(); // 启动其他服务
在启动核心服务功能中,会进行AMS的启动。
//frameworks/base/services/java/corri/android/server/SystemServer.java
private void startBootstrapServices() {
...
//这里会将ATMS注册到ServiceManager中,然后调用ATMS的start方法。
ActivityTaskManagerService atm = mSystemServiceManager.startService(ActivityTaskManagerService.Lifecycle.class).getService();
//重点方法1。 注册AMS服务,并返回对应的对象信息
mActivityManagerService = ActivityManagerService.Lifecycle.startService(mSystemServiceManager, atm);
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
//设置app安装器
mActivityManagerService.setInstaller(installer);
...
//重点方法2。 向ServiceManager中注册Binder服务
mActivityManagerService.setSystemProcess();
}
这里我们只截取了AMS的启动代码。
这里会通过startService方法来进行AMS的注册和启动过程。我们看一下具体的ActivityManagerService中的startService方法
startService
//
public static ActivityManagerService startService(SystemServiceManager ssm, ActivityTaskManagerService atm) {
sAtm = atm;
//调用SM的startService方法。创建AMS实例,并启动AMS
return ssm.startService(ActivityManagerService.Lifecycle.class).getService();
}
我们在ServiceManager的工作原理中讲解过,systemServiceManager.startService方法会将对应的服务注册到Service