AMS管理着activity,Service, Provide, BroadcastReceiver
android10后:出现ATMS,ActivityTaskManagerService:ATMS是从AMS中抽出来,单独管理着原来AMS中的Activity组件 。
现在我们对AMS的分析,也就包含对ATMS的分析了。
这些涉及到SystemServer进程,专用门于管理AMS等各种服务的。
SystemServer.java->main():
startBootStrap();
//启动atms.
-->atm = mSystemServiceManager.startService(ActivityTaskManagerService.LiftCycle.className).getService();
SystemServer->借助SystemServiceManager辅助类来管理90个多Services,所以不同的Services均需要封装成统一的父类即SystemService,这样一来方便让SystemServiceManager对它们进行统一管理 。(具体细节可以查看安卓启动流程关于SystemServer启动运行部分)
AMS、ATMS是给Application使用的, 怎么给Application使用的。通过Binder给到Application使用,我们需要将这些ATMS\AMS等服务的Binder注册进ServiceManager. Application要使用它们的时候,会去公共的ServiceManager中去查找对应的ATMS或AMS的binder,通过他们提供的Binder接口来使用这些服务的。为了完成这些服务,所以这些在SystemServer中的Service在进行类定义时必须将自己extends 成IBinder(Stub类),这样他们才能把自己的服务公布到ServiceManager中。
然后SystemServiceManager如何管理这些Services呢?是通过SystemService这个类(即LifeCycle)中的统一的接口如start(), stop(),restart()等
去间接管理各类Service.
如果需要让一个类继承多个父类时,java语言做不到,怎么办?
解决办法:可以在类里面创建一个内部类(LiftCycle),内部类去继承需要的父类SystemService,在这个内部类里面与我们的外部类(ATMS)结合来完成所有的功能。
以ATMS为例,ATMS的onStart()服务做了以下动作:
publishBinderService();//公布服务
mService.start();//调用atms服务的start接口。
-->atms在这个接口中只做一件事:
//将ATMS自已添加到LocalServices中,这个比较重要,除了让别人使用ATMS这个服务之外,
//SystemServer进程自己有时也需要获取使用这些服务,所以需要添加到LocalServices中。
LocalServices.addService();
上面的逻辑可以看出ATMS启动的时候没做什么事情。
ActivityManagerService.java->start():
mProcessCpuThread.start(); //cpu监控线程
mBatteryStatsService.publish(); //注册 电池状态及权限管理
SystemServer在启动完AMS后,会通过AMS启动电池管理等各种处理,AMS要做的任务太多了
如下所示:
mAMS->initPowerManagement();
mAMS->setSystemProcess(); //为app进程安排后期的各种进程的监控。
-->注册Activity至AMS内的ServiceManager类中
注册服务的ProcStats,进程状态
注册服务的meminfo,内存信息
注册服务的gfxinfo,图像信息
注册服务的dbinfo,数据库信息
注册服务的cpuinfo,cpu信息
注册服务的processinfo,进程信息等,还有缓存,权限等
以上工作是为了后期可以通过adb命令去收集这些信息,adb去调用dump接口(),
把这些关键的信息收集起来。因此AMS要做非常多的事情,所以将ATMS(只管理Activity部分)剥离出去。