理解ActivityManagerService

613 阅读2分钟

AMS家族


注:移除了Android7.0中的ActivityManagerProxy,代替它的是IActivityManager,作为AMS在本地的代理。

AMS的启动过程

在SystemServer进程中启动。

SystemServer.run()中创建SystemServiceManager——用来对系统的服务进行创建、启动和生命周期管理。

SystemServiceManager.startBootstrapServices()启动了AcitvityManagerService、PowerManagerService、PackageManagerService

SystemServiceManager.startCoreServices()启动了DropBoxManagerService、BatteryService、UsageStatsService和WebViewUpdateService

SystemServiceManager.startOtherServices()启动了CameraService、AlarmManagerService、VrManagerService

AMS与应用程序进程

  • 启动应用程序时AMS会检查这个应用程序需要的应用程序进程是否存在
  • 如果需要的应用程序进程不存在,AMS就会请求Zygote进程创建需要的应用程序进程

AMS重要的数据结构

ActivityRecord,内部记录了Activity的所有信息,用来描述一个Acitivity

TaskRecord,描述一个Activity任务栈

ActivityStack,管理系统所有的Activity:包括多种实例类型,存储Acitivity所有状态的AcitivityState,定义特殊状态的Activity,维护ActivityRecord、TaskRecord的ArrayList。

Activity栈管理

  1. Activity任务栈模型


  2. Launch Mode

standard:每次启动Activity都会创建一个新的实例。

singleTop:已在栈顶,不会创建新的,调用onNewIntent;如果不在栈顶,创建新的实例。

singleTask:Activity实例已经存在于其归属栈,栈中位于其上的Activity出栈,调用该实例的onNewIntent;要启动的Activity不存在于其归属栈,创建新实例入栈;如果归属栈不存在,创建新栈,然后创建新实例入栈。

singleInstance:已存在实例,onNewIntent;不存在,创建新任务栈,然后创建新实例入栈,并且新栈中只会存在这一个Activity实例。

  3. Intent的FLAG

如果LaunchMode和FLAG设定的启动方式有冲突,以FLAG为准。

  4. taskAffinity

指定Activity希望归属的任务栈

(1)与FLAG_ACTIVITY_NEW_TASK或者singleTask配合。

(2)与allowTakReparenting配合实现任务栈转移,从调用栈转移到更亲近的栈中。