Android ActivityManagerService

383 阅读2分钟

AMS版本上的区别

AMS的通信上,Android7.0和Android8.0有很大的区别。

Android7.0上,AMS主要是采用实现代理模式和Binder通信来实现APP和AMS的通信。

1629593243124.jpg

Android8.0上,AMS的通信使用的是AIDL的方式,总体上来说简单了很多。

1629593243119.jpg

AMS

AMS启动

AMS是在SystemService中启动的,SystemService的main方法中会调用run方法。在run方法里面会调用startBootstrapServices方法,在这个方法里面就会启动AMS。

AMS在启动Service或者Acticity的时候会去判断,Service或者Activity所属的进程是否存在,如果不存在会先去启动这个进程,在启动Service或者Activity。

在AMS中有很多数据结构,下面我们来看看ActivityRecord、TaskRecord和ActivityStack。

ActivityRecord

ActivityRecord是用来记录Activity的所有信息,用来描述一个Acticity,是在启动Activity的时候被创建的。ActivityRecord的重要成员变量如下:

1629594351251.jpg 这里面都是Activity的重要信息,ActivityRecord中也包含了TaskRecord,它是Activity任务栈的重要成员。

TaskRecord

TaskRecord用来描述一个Activity任务栈,现在我们来看看TaskRecord:

1629594606059.jpg

1629594641352.jpg 我们可以看到TastRecord中有很多重要信息,其中也包含了ActivityStack。

ActivityStack

ActivityStack是一个管理类,内部维护了系统所有Activity的状态。ActicityStack是ActivityStackSupervisor管理的,ActivityStackSupervisor在AMS的构造方法中被创建。

在ActivityStackSupervisor中有很多ActivityStack实例,比如mHomeStack,mFocusedStack,mLastFocusedStack。

  • mHomeStack:用来储存Launcher APP的所有Activity。
  • mFocusedStack:表示当前正在接受输入或者启动下一个Activity的所有Activity。
  • mLastFocusedStack:表示此前接受输入的所有Activity。
ActivityState

在ActivityStack中储存Activity状态的类是ActivityState。ActivityState是一个枚举,里面有RESUMED,PASING,STOPPING等状态。在调用overridePendingTranstition方法的时候也会根据当前Activity的状态来判断是否需要启动动画。

特殊状态Activity

在ActivityStack中还定义了一些特殊状态的Activity。

  • mPausingActivity 正在暂停的Activity
  • mLastPasedActivity 上一个已经暂停的Activity
  • mLastNoHistoryActivity 最近一次没有历史记录的Activity
  • mResumedActivity 已经Resume的Activity
  • mLastStarteActivity 最近一次启动的Activity
  • mTranslucentActivityWaiting 传递给convertToTraanslucent方法的最上层Activity

这些特殊状态的Activity都适用ActivitiRecord保存的。

Activity栈管理

先来看看Activity任务栈模型图:

1629602820089.jpg

TaskRecord管理了许多Activity,ActivityStack又管理了很多任务栈。

Activity在启动的时候可以设置启动模式,可以在Androidmanifest和Intent中设置,如果同时设置了,Intent会覆盖AndroidManifest的属性。所有设置的关于Activity的启动属性会在启动Activity的时候使用。