Android應(yīng)用程序組件Activity的"singleTask"(7)
首先是獲得用來(lái)啟動(dòng)Activity的Intent的Flags,并且保存在launchFlags變量中。
這里,launcFlags的Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP位沒(méi)有置位。
因此,notTop為null。
接下來(lái)的這個(gè)if語(yǔ)句:
- [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,它表示即將在啟動(dòng)的Activity,在這個(gè)例子中,即為SubActivity,因此,這里的 r.launchMode等于ActivityInfo.LAUNCH_SINGLE_TASK,于是,無(wú)條件將launchFlags的 Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP位置為1,表示這個(gè)SubActivity要在新的任務(wù)中啟動(dòng),但是別急,還 要看看其它條件是否滿足,如果條件都滿足,才可以在新的任務(wù)中啟動(dòng)這個(gè)SubActivity。
接下將addingToTask變量初始化為false,這個(gè)變量也將決定是否要將SubActivity在新的任務(wù)中啟動(dòng),從名字我們就可以看出, 默認(rèn)不增加到原有的任務(wù)中啟動(dòng),即要在新的任務(wù)中啟動(dòng)。這里的r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK條成立,條件r.resultTo == null也成立,它表這個(gè)Activity不需要將結(jié)果返回給啟動(dòng)它的Activity。于是會(huì)進(jìn)入接下來(lái)的if語(yǔ)句中,執(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ù),這個(gè)函數(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;
 - }
 - ......
 - }
 















 
 
 

 
 
 
 