理解ActivityManagerService
--摘自《Android进阶解密》
*AMS家族*
1.Android 7.0的AMS家族
2.AMP和AMS进行通信
3.(Android 7.0)AMP是AMN的内部类,它们都实现了IActivityManager接口,这样它们就可以实现代理模式,具体来讲是远程代理:AMP和AMN是运行在两个进程中的,AMP是Client端AMN则是Server端,而Server端中具体的功能都是由AMN的子类AMS来实现的,因此,AMP就是AMS在Client端的代理类。AMN又实现了BInder类,这样AMP和AMS就可以通过Binder来进行进程间通信。ActivityManager通过AMN的getDefault方法得到AMP,通过AMP就可以和AMS进行通信
4.Android 8.0AMS家族
要实现进程间通信,服务端也就是AMS只需要继承IActivityManager.Stub类并实现相应的方法就可以了。采用AIDL后就不需要使用AMS的代理类AMP了,因此Android 8.0去掉了AMP,代替它的是IActivityManager,它是AMS在本地的代理。
*AMS的启动过程*
1.AMS的启动是在SystemServer进程中启动的
2.SystemService的子类分为3中类型
1)引导服务:ActivityManagerService、PowerManagerService、PackageManagerService
2)核心服务:DropBoxManagerService、BatteryService、UsageStateService、WebViewUpdateService
3)其他服务:CameraService、AlarmManagerService、VrManagerService
3.AMS与应用程序进程的关系
1)启动应用程序时AMS会检查这个应用程序需要的应用程序进程是否存在
2)如果需要的应用程序进程不存在,AMS就会请求Zygote进程创建需要的应用程序进程
*AMS重要的数据结构*
------------
1.ActivityStack是一个管理类,用来管理系统所有的Activity,其内部维护了Activity的所有状态、特殊状态的Activity以及Activity相关的列表等数据。ActivityStack是由ActivityStackSupervisor来进行管理的
2.ActivityStack维护了元素类型为TaskRecord的列表,这样ActivityStack和TaskRecord就有了关联,Activity任务栈存储在ActivityStack中
*Activity任务栈模型*
1.TaskRecord用来表示Activity的任务栈
2.singleTop和singleTask时,该Activity的onNewIntent方法会被调用
3.如果Launch Mode和FLAG设定的Activity启动方式有冲突,则以FLAG设定的为准
*taskAffinity*
1.在AndroidManifest.xml中设置android:taskAffinity,用来指定Activity希望归属的栈。
2.如果allowTaskReparenting为true,说明Activity具有转移的能力
欢迎关注我的微信公众号:安卓圈