「这是我参与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组成。 任务栈有以下四种模式
- standard时活动默认的启动模式,每当启动一个新的Activity,它就会在返回栈中入栈,并处于栈顶的位置。
- singkeTop模式,在启动活动时如果发现栈顶已经是该活动,则直接可以使用它,不会创建新的Activity实例。
- singleTask,每次启动该活动时,检测返回栈中是否有该活动的实例,如果存在则直接使用。并将该活动上的所有活动统统出栈。
- 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。