ActivityManagerService简析

1,884 阅读2分钟

「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

ActivityManagerService简析

主要负责系统中四大组件的启动、切换、和调度等工作。当发起进程启动或者组件启动时,都会通过Binder通信机制将请求传递给AMS。

8.0之后,AMS通过AIDL完成Binder通信,主要涉及三部分ActivityRecord、TaskRecord和ActivityStack

ActivityRecord

An entry in the history stack, representing an activity.

ActivityRecord包含大量成员信息,存储着一个Activity的所有数据信息。

private TaskRecord task;    //the task this is in

此成员变量代表当前Activity所在的栈。

由此看出:ActivityRecord和TaskRecord建立了联系。在startActivity()时会创建ActivityRecord对象。

TaskRecord

不要以为任务栈就是程序,一个程序可能有多个任务栈。

/** List of all activities in the task arranged in history order */    
final ArrayList<ActivityRecord> mActivities;
/** Current stack. Setter must always be used to update the value. */    
private ActivityStack mStack;

mActivities表示当前任务栈中的所有Activity;mStack表示TaskRecord所在的stack;在startActivity时,也会创建TaskRecord。

TaskRecord由一个或者多个ActivityRecord组成。 任务栈有以下四种模式

  1. standard时活动默认的启动模式,每当启动一个新的Activity,它就会在返回栈中入栈,并处于栈顶的位置。
  1. singkeTop模式,在启动活动时如果发现栈顶已经是该活动,则直接可以使用它,不会创建新的Activity实例。
  1. singleTask,每次启动该活动时,检测返回栈中是否有该活动的实例,如果存在则直接使用。并将该活动上的所有活动统统出栈。
  1. singleInstance,启动一个新的返回栈管理这个活动。在这种模式下会有一个单独的返回栈来管理这个活动,不管哪个应用访问这个Activity,都会共用一个返回栈,进而解决共享实例的问题。

adb shell dumpsys activity

查看当前手机的任务栈运行情况

ActivityStack

/**
  * The back history of all previous (and possibly still     
* running) activities.  It contains #TaskRecord objects.     
*/   
private final ArrayList<TaskRecord> mTaskHistory = new ArrayList<>();

ActivityStack内部维护了一个ArrayList用来管理TaskRecord。交由ActivityStackSupervisor管理,维护管理Activity所有状态, 并对其进行分类管理。

总结

一个ActivityRecord对应一个Activity,其中包含了Activity的所有信息,Activity可能会被多次启动这和启动模式有关系,所以Activity可能会有多个ActivityRecord;TaskRecord由一个或多个ActivityRecord组成;ActivityStack用来管理TaskRecord。