上滑動導(dǎo)航欄手勢桌面最近任務(wù)可見解密-千里馬手把手帶你搞定framework車載車機系統(tǒng)
建議先看另一篇blog: https://blog.csdn.net/learnframework/article/details/123032419[1]

系統(tǒng)如何讓桌面執(zhí)行對應(yīng)的onStart方法呢?
具體的堆棧顯示如下:
makeActiveIfNeeded:5788,?ActivityRecord?(com.android.server.wm)
導(dǎo)致onStart調(diào)用關(guān)鍵就在于這里的startRecentsActivity會觸發(fā)ensureActivitiesVisible方法,正常的ensureActivitiesVisible只是來保證當(dāng)前一些ActivityRecord的屬性值或者config變化了,靠調(diào)用ensureActivitiesVisible來保證Activity的visibility可以顯示正常
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)

這里的
targetActivity.mLaunchTaskBehind = true;
就是最為關(guān)鍵的點,它代表者可以在其他activity的后面可以顯示。
疑問為啥只是到了onStart而不走到onResume:
根據(jù)上面的堆棧來看這個核心方法makeActiveIfNeeded
boolean?makeActiveIfNeeded(ActivityRecord?activeActivity)?{
//判斷Activity是應(yīng)該被Resume
????????if?(shouldResumeActivity(activeActivity))?{
????????????return?getRootTask().resumeTopActivityUncheckedLocked(activeActivity?/*?prev?*/,
????????????????????null?/*?options?*/);
????????}?else?if?(shouldPauseActivity(activeActivity))?{
//判斷Activity是應(yīng)該被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;
????}
那么這里其實最主要我們關(guān)注是shouldResumeActivity(activeActivity)方法為啥沒有返回true,而返回來false,導(dǎo)致進入到了shouldStartActivity方法 看看shouldResumeActivity方法:
??@VisibleForTesting
????boolean?shouldResumeActivity(ActivityRecord?activeActivity)?{
????//主要調(diào)用到了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;
????????}
//核心就是這個地方,前面設(shè)置了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;
????}
引用鏈接
[1]
建議先看另一篇blog:
https://blog.csdn.net/learnframework/article/details/123032419: https://blog.csdn.net/learnframework/article/details/123032419
更多干貨framework車載車機手機系統(tǒng)開發(fā)干貨課程請加千里馬本人微信
