2021.11.10更新:
最近android升级为S版本,阅读Framework代码时,ActivityStack已经被删掉,源码中只有Task,因此在此做记录。
同R版本一样,Task依然在ActivityStart.startActivityInner中创造,依然采用reuseOrCreate方式创造,但代码更加简洁了,核心方法如下,先判断是否可重用Task,否则直接创建一个,Task创建过程变为构造者模式。值得注意的是,ActivityStackSupervisor同样改为ActivityTaskSupervisor。
Task reuseOrCreateTask(ActivityInfo info, Intent intent, IVoiceInteractionSession voiceSession,
IVoiceInteractor voiceInteractor, boolean toTop, ActivityRecord activity,
ActivityRecord source, ActivityOptions options) {
Task task;
if (canReuseAsLeafTask()) {
// This root task will only contain one task, so just return itself since all root
// tasks ara now tasks and all tasks are now root tasks.
task = reuseAsLeafTask(voiceSession, voiceInteractor, intent, info, activity);
} else {
// Create child task since this root task can contain multiple tasks.
final int taskId = activity != null
? mTaskSupervisor.getNextTaskIdForUser(activity.mUserId)
: mTaskSupervisor.getNextTaskIdForUser();
task = new Task.Builder(mAtmService)
.setTaskId(taskId)
.setActivityInfo(info)
.setActivityOptions(options)
.setIntent(intent)
.setVoiceSession(voiceSession)
.setVoiceInteractor(voiceInteractor)
.setOnTop(toTop)
.setParent(this)
.build();
}
int displayId = getDisplayId();
if (displayId == INVALID_DISPLAY) displayId = DEFAULT_DISPLAY;
final boolean isLockscreenShown = mAtmService.mTaskSupervisor.getKeyguardController()
.isKeyguardOrAodShowing(displayId);
if (!mTaskSupervisor.getLaunchParamsController()
.layoutTask(task, info.windowLayout, activity, source, options)
&& !getRequestedOverrideBounds().isEmpty()
&& task.isResizeable() && !isLockscreenShown) {
task.setBounds(getRequestedOverrideBounds());
}
return task;
}
-------------------------------------------------------------------------------------------------------------------------
原文:
关于三者关系,可以用如下图来说明,一般一个包名对应一个Task,可是如果某Activity启动模式设置为SingleInstance,则会为其单独创建一个Task,其中的ActivityStack中只有单独的Activity;
ActivityStack用来记录Activity历史,以便Back回退时仿佛在同一个应用中(事实也如此),直到回退到HomeActivity;
如果多个Activity的TaskAffinity相同,则认为是同一个任务,共享一个Task;
ActivityStack继承自Task,所以实际Task就是ActivityStack;
如果Activity的TaskAffinity不同,系统会新创建一个Task,在PcMode下就表现为创建了两个窗口;
TaskAffinity意为任务相关性,一般默认包名;
如果是不同进程,那么就会有不同Task。注意同一进程可以有多个Task(比如singleInstance这一特殊启动模式或者FLAG_NEW_TASK flag);
另外一个重要概念是Display,可以理解为手机屏幕进行划分,每个Display就拥有独立的多个Task,彼此没有联系;
咱们进入源码查看细节,
在ActivityStart的startActivityInner函数中,涉及了Stack、Task相关描述,
|
委托给RootWindowContainer创建
|
咱们具体进入RootWindowContainer中查看
|
进入TaskDisplayArea
|
----------------------------------------------------------------------------------------------------------------------------
Task的创建同在StartActivityInner函数中,
|
进入setNewTask中查看吧,
|
进入ActivityStack中,
|
可以看到,只有ACTIVITY_TYPE_STANDARD才会一直去Create Task,对于Home或者Recent则不那么做。
|