最初に別のブログを読むことをお勧めします:
https://blog.csdn.net/learnframework/article/details/123032419
システムはどのようにしてデスクトップに対応する onStart メソッドを実行させるのでしょうか?
具体的なスタックを以下に示します。
makeActiveIfNeeded:5788, ActivityRecord (com.android.server.wm)
makeVisibleIfNeeded:5697, ActivityRecord (com.android.server.wm)
setActivityVisibilityState:210, EnsureActivitiesVisibleHelper (com.android.server.wm)
process:143, EnsureActivitiesVisibleHelper (com.android.server.wm)
updateActivityVisibilities:1117, TaskFragment (com.android.server.wm)
lambda$ensureActivitiesVisible$18:4857, Task (com.android.server.wm)
accept:-1, Task$$ExternalSyntheticLambda23 (com.android.server.wm)
forAllLeafTasks:3174, Task (com.android.server.wm)
forAllLeafTasks:3162, Task (com.android.server.wm)
ensureActivitiesVisible:4856, Task (com.android.server.wm)
lambda$ensureActivitiesVisible$45:6293, DisplayContent (com.android.server.wm)
accept:-1, DisplayContent$$ExternalSyntheticLambda38 (com.android.server.wm)
forAllRootTasks:3186, Task (com.android.server.wm)
forAllRootTasks:2014, WindowContainer (com.android.server.wm)
forAllRootTasks:2014, WindowContainer (com.android.server.wm)
forAllRootTasks:2014, WindowContainer (com.android.server.wm)
forAllRootTasks:2014, WindowContainer (com.android.server.wm)
forAllRootTasks:2014, WindowContainer (com.android.server.wm)
forAllRootTasks:2014, WindowContainer (com.android.server.wm)
forAllRootTasks:2007, WindowContainer (com.android.server.wm)
ensureActivitiesVisible:6292, DisplayContent (com.android.server.wm)
ensureActivitiesVisible:1864, RootWindowContainer (com.android.server.wm)
ensureActivitiesVisible:1845, RootWindowContainer (com.android.server.wm)
startRecentsActivity:260, RecentsAnimation (com.android.server.wm)
startRecentsActivity:1729, ActivityTaskManagerService (com.android.server.wm)
onTransact:1171, IActivityTaskManager$Stub (android.app)
onTransact:5183, ActivityTaskManagerService (com.android.server.wm)
execTransactInternal:1280, Binder (android.os)
execTransact:1244, Binder (android.os)
onStart 呼び出しの重要な点は、ここでの startRecentsActivity が ensureActivitiesVisible メソッドをトリガーすることです。通常の ensureActivitiesVisible は、現在の ActivityRecord 属性値または設定の変更を確認するだけです。ensureActivitiesVisible を呼び出すことで、アクティビティの可視性が正常に表示されることを確認します。
targetActivity.mLaunchTaskBehind = true;ここ
が最も重要な点で、これは他のアクティビティの背後に表示できることを意味します。
なぜ onStart のみに移行し、onResume には移行しないのか疑問です。
上記のスタックに基づいて、このコア メソッド makeActiveIfNeeded を見てください。
boolean makeActiveIfNeeded(ActivityRecord activeActivity) {
//判断Activity是应该被Resume
if (shouldResumeActivity(activeActivity)) {
return getRootTask().resumeTopActivityUncheckedLocked(activeActivity /* prev */,
null /* options */);
} else if (shouldPauseActivity(activeActivity)) {
//判断Activity是应该被Pasue
setState(PAUSING, "makeActiveIfNeeded");
mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), token,
PauseActivityItem.obtain(finishing, false /* userLeaving */,
configChangeFlags, false /* dontReport */));
} else if (shouldStartActivity()) {
setState(STARTED, "makeActiveIfNeeded");
try {
mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), token,
StartActivityItem.obtain(takeOptions()));
}
mTaskSupervisor.mStoppingActivities.remove(this);
}
return false;
}
ここでの主な懸念は、 shouldResumeActivity(activeActivity) メソッドが true を返さずに false を返し、 shouldStartActivity メソッドにつながる理由です
。
@VisibleForTesting
boolean shouldResumeActivity(ActivityRecord activeActivity) {
//主要调用到了shouldBeResumed
return shouldBeResumed(activeActivity) && !isState(RESUMED);
}
private boolean shouldBeResumed(ActivityRecord activeActivity) {
//shouldBeResumed方法又有若干条件,任何条件不满足都是不可以的,先看看第一个条件shouldMakeActive
return shouldMakeActive(activeActivity) && isFocusable()
&& getTaskFragment().getVisibility(activeActivity)
== TASK_FRAGMENT_VISIBILITY_VISIBLE
&& canResumeByCompat();
}
boolean shouldMakeActive(ActivityRecord activeActivity) {
if (!isState(STARTED, RESUMED, PAUSED, STOPPED, STOPPING)
// TODO (b/185876784) Check could we remove the check condition
// mTranslucentActivityWaiting != null here
|| getRootTask().mTranslucentActivityWaiting != null) {
return false;
}
if (this == activeActivity) {
return false;
}
if (!mTaskSupervisor.readyToResume()) {
// Making active is currently deferred (e.g. because an activity launch is in progress).
return false;
}
//核心就是这个地方,前面设置了mLaunchTaskBehind为true,所以这里就返回false了
if (this.mLaunchTaskBehind) {
// This activity is being launched from behind, which means that it's not intended to be
// presented to user right now, even if it's set to be visible.
return false;
}
return getTaskFragment().topRunningActivity() == this;
}