• 理解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具有转移的能力

    欢迎关注我的微信公众号:安卓圈

  • 相关阅读:
    与DSP通信时,RD&WR信号
    4.2.1 Vector bit-select and part-select addressing
    数据校验
    数据结构 (树,图)
    ASOP编译说明
    os
    20180203-增与查
    yum安装MariaDB
    20180202之engine,URL,base,session
    列表
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/10181845.html
Copyright © 2020-2023  润新知