Activity栈管理 有助于理解Activity启动流程
Activity在AMS 中存在的形式为ActivityRecord;
AMS以Task的方式管理Activity,Task在AMS存在的形式为TaskRecord
TaskRecord在AMS中依靠ActivityStack去管理
ActivityStack同样有管理者,ActivityStackSupervisor负责管理ActivityStack;
主要涉及四个类
ActivityRecord
存在历史栈的一个实例,代表一个Activity。
TaskRecord
真正的Activity栈,内部维护一个ArrayList
ActivityStack 栈的结构类
并不是一个Activity栈,严格意义上来说TaskRecord才是Activity栈,这个类负责管理各个TaskRecord,内部维护了一个ArrayList
+ActivityStackSupervisor
内部持有一个ActivityStack,而ActivityStack内部也持有ActivityStackSupervisor,相当于ActivityStack的辅助管理类
ActivityRecord
ActivityRecord是Activity在AMS中的存在形式,ActivityRecord保存了Activity的信息。
final class ActivityRecord {
TaskRecord task; // 自己所在的TaskRecord,这样查找就不需要通过遍历所有的TaskRecord
int theme;//主题
int launchMode;//启动模式
...
}
TaskRecord
AMS以Task的方式在管理Activity,Android把用户一次操作相关的Activity按照先后顺序保存在一个Task中,这个Task在AMS中的存在形式就是TaskRecord;
TaskRecord中的mActivities是一个栈,它的作用是以栈的方式组织管理Activity。
final class TaskRecord {
...........
final int taskId; // Unique identifier for this task.
int mAffiliatedTaskId; // taskId of parent affiliation or self if no parent.
// 是指root activity的affinity,即该Task中第一个Activity; 可以理解为当前task的name;
String affinity; // The affinity name for this task, or null; may change identity.
// 启动这个task的intent
Intent intent; // The original intent that started the task.
// task模式
int mLockTaskMode; // Which tasklock mode to launch this task in. One of
// ActivityManager.LOCK_TASK_LAUNCH_MODE_*
// 该Task中所有的Activity
final ArrayList<ActivityRecord> mActivities;
// 管理该Task的ActivityStack,
ActivityStack stack;
// 最近列表中,可以看到当前Task的缩略图
private Bitmap mLastThumbnail; // Last thumbnail captured for this item.
private final File mLastThumbnailFile; // File containing last thumbnail.
final ActivityManagerService mService;
..........
}
ActivityStack
TaskRecord的管理类
final class ActivityStack {
private final ArrayList<TaskRecord> mTaskHistory = new ArrayList<>(); //ActivityStack中所有的TaskRecord
private final ArrayList<ActivityRecord> mLRUActivities = new ArrayList<>();//最近活动过的ActivityRecord
......
final int mStackId; //ActivityStack的唯一标识
final ActivityContainer mActivityContainer;
/** The other stacks, in order, on the attached display. Updated at attach/detach time. */
ArrayList<ActivityStack> mStacks; //绑定的ActivityDisplay中的所有ActivityStack
/** The attached Display's unique identifier, or -1 if detached */
int mDisplayId;//绑定的ActivityDisplay的id,默认为Display.DEFAULT_DISPLAY = 0;
......
//ActivityStack的管理者ActivityStackSupervisor,通过其运行所有的ActivityStacks
final ActivityStackSupervisor mStackSupervisor;
ActivityStack(ActivityStackSupervisor.ActivityContainer activityContainer, RecentTasks recentTasks) {
mStackSupervisor = activityContainer.getOuter();
...
}
}
ActivityStackSupervisor
ActivityStackSupervisor 用于管理ActivityStack;ActivityStackSupervisor为AMS提供管理方法;管理着系统中的三个ActivityStack;
public final class ActivityStackSupervisor {
//mHomeStack管理的是Launcher相关的Activity栈
private ActivityStack mHomeStack;
//mFocusedStack管理的是当前显示在前台Activity的Activity栈;
private ActivityStack mFocusedStack;
/** 保存上一次显示在前台的Activity栈 */
private ActivityStack mLastFocusedStack;
/** List of activities that are waiting for a new activity to become visible before completing
* whatever operation they are supposed to do. */
final ArrayList<ActivityRecord> mWaitingVisibleActivities = new ArrayList<ActivityRecord>();
/** List of processes waiting to find out about the next visible activity. */
final ArrayList<IActivityManager.WaitResult> mWaitingActivityVisible =
new ArrayList<IActivityManager.WaitResult>();
/** List of processes waiting to find out about the next launched activity. */
final ArrayList<IActivityManager.WaitResult> mWaitingActivityLaunched =
new ArrayList<IActivityManager.WaitResult>();
/** List of activities that are ready to be stopped, but waiting for the next activity to
* settle down before doing so. */
final ArrayList<ActivityRecord> mStoppingActivities = new ArrayList<ActivityRecord>();
/** List of activities that are ready to be finished, but waiting for the previous activity to
* settle down before doing so. It contains ActivityRecord objects. */
final ArrayList<ActivityRecord> mFinishingActivities = new ArrayList<ActivityRecord>();
/** List of activities that are in the process of going to sleep. */
final ArrayList<ActivityRecord> mGoingToSleepActivities = new ArrayList<ActivityRecord>();
......
/** Mapping from (ActivityStack/TaskStack).mStackId to their current state */
private SparseArray<ActivityContainer> mActivityContainers = new SparseArray<ActivityContainer>();//以mStackId为key
/** Mapping from displayId to display current state */
private final SparseArray<ActivityDisplay> mActivityDisplays =
new SparseArray<ActivityDisplay>();//以displayId为key
}
ActivityDisplay
是ActivityContainer内部类
可以理解成为一个屏幕,保存着该屏幕的ActivityStack的数组mStacks,并对其进行管理操作。同时也保存了该屏幕下单特殊ActivityStatck,如mHomeStack、mRecentsStack、mPinnedStack、mSplitScreenPrimaryStack。