一锈候、主要涉及4個(gè)類
1) ActivityRecord
源碼注釋:An entry in the history stack, representing an activity.
翻譯一下:存在歷史棧的一個(gè)實(shí)例,代表一個(gè)Activity敞贡。
2) TaskRecord
Activity棧泵琳,內(nèi)部維護(hù)一個(gè)ArrayList<ActivityRecord>
3) ActivityStack
并不是一個(gè)Activity棧,真正意義上的Activity棧是TaskRecord,這個(gè)類是負(fù)責(zé)管理各個(gè)Activity棧获列,內(nèi)部維護(hù)一個(gè)ArrayList<TaskRecord>
4) ActivityStackSupervisor
內(nèi)部持有一個(gè)ActivityStack谷市,而ActivityStack內(nèi)部也持有ActivityStackSupervisor,相當(dāng)于ActivityStack的輔助管理類
ActivityRecord
final class ActivityRecord {
TaskRecord task; // the task this is in.
final IApplicationToken.Stub appToken;
final int userId;
int theme;
int launchMode;
...
}
成員變量task表示自己所在的TaskRecord击孩,這樣要找到自己所在的TaskRecord就不必遍歷查找了迫悠。
TaskRecord
final class TaskRecord {
/** List of all activities in the task arranged in history order */
final ArrayList<ActivityRecord> mActivities;
/** Current stack */
ActivityStack stack;
}
同樣的道理,成員變量stack表示自己所在的ActivityStack
ActivityStack
final class ActivityStack {
private ArrayList<TaskRecord> mTaskHistory = new ArrayList<>();
/** Run all ActivityStacks through this */
final ActivityStackSupervisor mStackSupervisor;
ActivityStack(ActivityStackSupervisor.ActivityContainer activityContainer, RecentTasks recentTasks) {
mStackSupervisor = activityContainer.getOuter();
...
}
}
ActivityStackSupervisor
public final class ActivityStackSupervisor {
private ActivityStack mFocusedStack;
}
二巩梢、場(chǎng)景解析
1创泄、從桌面第一次啟動(dòng)App
startActivityLocked里構(gòu)造一個(gè)ActivityRecord
新建一個(gè)TaskRecord,并存入mTaskHistory
ActivityRecord存入mActivities
final int startActivityUncheckedLocked(...) {
final int startActivityUncheckedLocked(...) {
if (reuseTask == null) {
r.setTask(targetStack.createTaskRecord(...);
...
targetStack.startActivityLocked(r, newTask, doResume, keepCurTransition, options);
...
}
}
- TaskRecord存入mTaskHistory
TaskRecord createTaskRecord(int taskId, ActivityInfo info, Intent intent,
IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
boolean toTop) {
TaskRecord task = new TaskRecord(mService, taskId, info, intent, voiceSession,
voiceInteractor);
addTask(task, toTop, false);
return task;
}
void addTask(final TaskRecord task, final boolean toTop, boolean moving) {
task.stack = this;
if (toTop) {
insertTaskAtTop(task, null);
} else {
mTaskHistory.add(0, task);
updateTaskMovement(task, false);
}
...
}
private void insertTaskAtTop(TaskRecord task, ActivityRecord newActivity) {
...
mTaskHistory.add(taskNdx, task);
updateTaskMovement(task, true);
}
- ActivityRecord存入mActivities
final void startActivityLocked(ActivityRecord r, boolean newTask, ...) {
...
task = mTaskHistory.get(taskNdx);
...
task.addActivityToTop(r);
}
void addActivityToTop(ActivityRecord r) {
addActivityAtIndex(mActivities.size(), r);
}
void addActivityAtIndex(int index, ActivityRecord r) {
...
mActivities.add(index, r);
...
}
2括蝠、App啟動(dòng)一個(gè)Activity
會(huì)不會(huì)新建一個(gè)TaskRecord取決于launchMode鞠抑,默認(rèn)的standard模式不會(huì)創(chuàng)建新的TaskRecord
構(gòu)造一個(gè)ActivityRecord存入mActivities,與上面第二步一樣
3忌警、回退
/** @return true if this was the last activity in the task */
boolean removeActivity(ActivityRecord r) {
mActivities.remove(r);
...
if (mActivities.isEmpty()) {
return !mReuseTask;
}
...
return false;
}
4搁拙、再次回退,回到桌面
從mActivities移除當(dāng)前ActivityRecord與上面一樣法绵,只是當(dāng)mActivities為空時(shí)箕速,會(huì)觸發(fā)mTaskHistory移除當(dāng)前TaskRecord,如果mTaskHistory為空朋譬,則切換到桌面盐茎,給mStackSupervisor.mFocusedStack重新賦值
private void removeActivityFromHistoryLocked(ActivityRecord r, String reason) {
...
final TaskRecord task = r.task;
if (task != null && task.removeActivity(r)) {
if (mStackSupervisor.isFrontStack(this) && task == topTask() &&
task.isOverHomeStack()) {
mStackSupervisor.moveHomeStackTaskToTop(task.getTaskToReturnTo(), reason);
}
removeTask(task, reason);
}
}
void removeTask(TaskRecord task, String reason, boolean notMoving) {
...
mTaskHistory.remove(task);
...
if (mTaskHistory.isEmpty()) {
final boolean notHomeStack = !isHomeStack();
if (isOnHomeDisplay()) {
String myReason = reason + " leftTaskHistoryEmpty";
if (mFullscreen || !adjustFocusToNextVisibleStackLocked(null, myReason)) {
mStackSupervisor.moveHomeStack(notHomeStack, myReason);
}
}
...
}
...
task.stack = null;
}
如果不是從Activity調(diào)用startActivity,那么目標(biāo)Activity就不知道自己該屬于哪個(gè)TaskRecord此熬,所以得指定FLAG_ACTIVITY_NEW_TASK庭呜,就會(huì)新建一個(gè)TaskRecord