溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Activity的singleTask怎么使用

發(fā)布時間:2021-12-18 16:35:57 來源:億速云 閱讀:114 作者:iii 欄目:移動開發(fā)

這篇文章主要講解了“Activity的singleTask怎么使用”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Activity的singleTask怎么使用”吧!

首先是獲得用來啟動Activity的Intent的Flags,并且保存在launchFlags變量中。

這里,launcFlags的Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP位沒有置位。

因此,notTop為null。

接下來的這個if語句:

[java] view plaincopy if (sourceRecord == null) { ...... } else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE)  ...... } else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) { // The activity being started is a single instance... it always // gets launched into its own task. launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; }

這里變量r的類型為ActivityRecord,它表示即將在啟動的Activity,在這個例子中,即為SubActivity,因此,這里的 r.launchMode等于ActivityInfo.LAUNCH_SINGLE_TASK,于是,無條件將launchFlags的 Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP位置為1,表示這個SubActivity要在新的任務(wù)中啟動,但是別急,還 要看看其它條件是否滿足,如果條件都滿足,才可以在新的任務(wù)中啟動這個SubActivity。

接下將addingToTask變量初始化為false,這個變量也將決定是否要將SubActivity在新的任務(wù)中啟動,從名字我們就可以看出, 默認不增加到原有的任務(wù)中啟動,即要在新的任務(wù)中啟動。這里的r.launchMode ==  ActivityInfo.LAUNCH_SINGLE_TASK條成立,條件r.resultTo ==  null也成立,它表這個Activity不需要將結(jié)果返回給啟動它的Activity。于是會進入接下來的if語句中,執(zhí)行:

[java] view plaincopy ActivityRecord taskTop = r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE  ? findTaskLocked(intent, r.info)  : findActivityLocked(intent, r.info)

這里的條件r.launchMode !=  ActivityInfo.LAUNCH_SINGLE_INSTANCE成立,于是執(zhí)行findTaskLocked函數(shù),這個函數(shù)也是定義在 frameworks/base/services/java/com/android/server/am/ActivityStack.java文件中:

[java] view plaincopypublic class ActivityStack {     ......     /**     * Returns the top activity in any existing task matching the given     * Intent. Returns null if no such task is found.     */     private ActivityRecord findTaskLocked(Intent intent, ActivityInfo info)     {     ComponentName cls = intent.getComponent();     if (info.targetActivity != null) {     cls = new ComponentName(info.packageName, info.targetActivity);     }     TaskRecord cp = null;     final int N = mHistory.size();     for (int i=(N-1); i>=0; i--) {     ActivityRecord r = (ActivityRecord)mHistory.get(i);     if (!r.finishing && r.task != cp     && r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE) {     cp = r.task;     //Slog.i(TAG, "Comparing existing cls=" +     r.task.intent.getComponent().flattenToShortString()     // + "/aff=" + r.task.affinity + " to new cls="     // + intent.getComponent().flattenToShortString() + "/aff=" +     taskAffinity);     if (r.task.affinity != null) {     if (r.task.affinity.equals(info.taskAffinity)) {     //Slog.i(TAG, "Found matching affinity!");     return r;     }     } else if (r.task.intent != null     && r.task.intent.getComponent().equals(cls)) {     //Slog.i(TAG, "Found matching class!");     //dump();     //Slog.i(TAG, "For Intent " + intent + " bringing to top: " +     r.intent);     return r;     } else if (r.task.affinityIntent != null     && r.task.affinityIntent.getComponent().equals(cls)) {     //Slog.i(TAG, "Found matching class!");     //dump();     //Slog.i(TAG, "For Intent " + intent + " bringing to top: " +     r.intent);     return r;     }     }     }     return null;     }     ......     }

感謝各位的閱讀,以上就是“Activity的singleTask怎么使用”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對Activity的singleTask怎么使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI