基於Android 6.0的源碼剖析, 分析android Activity啟動流程,相關源碼:
frameworks/base/services/core/java/com/android/server/am/ - ActivityManagerService.java - ActivityStackSupervisor.java - ActivityStack.java - ActivityRecord.java - ProcessRecord.java frameworks/base/core/java/android/app/ - IActivityManager.java - ActivityManagerNative.java (內含AMP) - ActivityManager.java - IApplicationThread.java - ApplicationThreadNative.java (內含ATP) - ActivityThread.java (內含ApplicationThread) - ContextImpl.java
一. 概述
startActivity
的整體流程與startService啟動過程分析非常相近,但比Service啟動更為復雜,多了stack/task以及UI的相關內容以及Activity的生命周期更為豐富。
Activity啟動發起后,通過Binder最終交由system進程中的AMS來完成,則啟動流程如下圖:
接下來,從源碼來說說每個過程。
二. 啟動流程
2.1 Activity.startActivity
[-> Activity.java]
public void startActivity(Intent intent) { this.startActivity(intent, null); } public void startActivity(Intent intent, @Nullable Bundle options) { if (options != null) { startActivityForResult(intent, -1, options); } else { //[見小節2.2] startActivityForResult(intent, -1); } }
2.2 startActivityForResult
[-> Activity.java]
public void startActivityForResult(Intent intent, int requestCode) { startActivityForResult(intent, requestCode, null); } public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) { if (mParent == null) { //[見小節2.3] Instrumentation.ActivityResult ar = mInstrumentation.execStartActivity( this, mMainThread.getApplicationThread(), mToken, this, intent, requestCode, options); if (ar != null) { mMainThread.sendActivityResult( mToken, mEmbeddedID, requestCode, ar.getResultCode(), ar.getResultData()); } //此時requestCode =-1 if (requestCode >= 0) { mStartedActivity = true; } cancelInputsAndStartExitTransition(options); } else { ... } }
execStartActivity()方法的參數:
mAppThread
: 數據類型為ApplicationThread,通過mMainThread.getApplicationThread()方法獲取。mToken
: 數據類型為IBinder.
2.3 execStartActivity
[-> Instrumentation.java]
public ActivityResult execStartActivity( Context who, IBinder contextThread, IBinder token, Activity target, Intent intent, int requestCode, Bundle options) { IApplicationThread whoThread = (IApplicationThread) contextThread; ... if (mActivityMonitors != null) { synchronized (mSync) { final int N = mActivityMonitors.size(); for (int i=0; i<N; i++) { final ActivityMonitor am = mActivityMonitors.get(i); if (am.match(who, null, intent)) { am.mHits++; //當該monitor阻塞activity啟動,則直接返回 if (am.isBlocking()) { return requestCode >= 0 ? am.getResult() : null; } break; } } } } try { intent.migrateExtraStreamToClipData(); intent.prepareToLeaveProcess(); //[見小節2.4] int result = ActivityManagerNative.getDefault() .startActivity(whoThread, who.getBasePackageName(), intent, intent.resolveTypeIfNeeded(who.getContentResolver()), token, target != null ? target.mEmbeddedID : null, requestCode, 0, null, options); //檢查activity是否啟動成功 checkStartActivityResult(result, intent); } catch (RemoteException e) { throw new RuntimeException("Failure from system", e); } return null; }
關於 ActivityManagerNative.getDefault()返回的是ActivityManagerProxy對象. 此處startActivity()的共有10個參數, 下面說說每個參數傳遞AMP.startActivity()每一項的對應值:
- caller: 當前應用的ApplicationThread對象mAppThread;
- callingPackage: 調用當前ContextImpl.getBasePackageName(),獲取當前Activity所在包名;
- intent: 這便是啟動Activity時,傳遞過來的參數;
- resolvedType: 調用intent.resolveTypeIfNeeded而獲取;
- resultTo: 來自於當前Activity.mToken
- resultWho: 來自於當前Activity.mEmbeddedID
- requestCode = -1;
- startFlags = 0;
- profilerInfo = null;
- options = null;
2.4 AMP.startActivity
[-> ActivityManagerNative.java :: ActivityManagerProxy]
class ActivityManagerProxy implements IActivityManager { ... public int startActivity(IApplicationThread caller, String callingPackage, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle options) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); data.writeStrongBinder(caller != null ? caller.asBinder() : null); data.writeString(callingPackage); intent.writeToParcel(data, 0); data.writeString(resolvedType); data.writeStrongBinder(resultTo); data.writeString(resultWho); data.writeInt(requestCode); data.writeInt(startFlags); if (profilerInfo != null) { data.writeInt(1); profilerInfo.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE); } else { data.writeInt(0); } if (options != null) { data.writeInt(1); options.writeToParcel(data, 0); } else { data.writeInt(0); } //[見流程2.5] mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0); reply.readException(); int result = reply.readInt(); reply.recycle(); data.recycle(); return result; } ... }
AMP經過binder IPC,進入ActivityManagerNative(簡稱AMN)。接下來程序進入了system_servr進程,開始繼續執行。
2.5 AMN.onTransact
[-> ActivityManagerNative.java]
public boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException { switch (code) { case START_ACTIVITY_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); IBinder b = data.readStrongBinder(); IApplicationThread app = ApplicationThreadNative.asInterface(b); String callingPackage = data.readString(); Intent intent = Intent.CREATOR.createFromParcel(data); String resolvedType = data.readString(); IBinder resultTo = data.readStrongBinder(); String resultWho = data.readString(); int requestCode = data.readInt(); int startFlags = data.readInt(); ProfilerInfo profilerInfo = data.readInt() != 0 ? ProfilerInfo.CREATOR.createFromParcel(data) : null; Bundle options = data.readInt() != 0 ? Bundle.CREATOR.createFromParcel(data) : null; //[見流程2.6] int result = startActivity(app, callingPackage, intent, resolvedType, resultTo, resultWho, requestCode, startFlags, profilerInfo, options); reply.writeNoException(); reply.writeInt(result); return true; } ... } }
2.6 AMS.startActivity
[-> ActivityManagerService.java]
public final int startActivity(IApplicationThread caller, String callingPackage, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle options) { return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo, resultWho, requestCode, startFlags, profilerInfo, options, UserHandle.getCallingUserId()); } public final int startActivityAsUser(IApplicationThread caller, String callingPackage, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle options, int userId) { enforceNotIsolatedCaller("startActivity"); userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId, false, ALLOW_FULL_ONLY, "startActivity", null); //[見小節2.7] return mStackSupervisor.startActivityMayWait(caller, -1, callingPackage, intent, resolvedType, null, null, resultTo, resultWho, requestCode, startFlags, profilerInfo, null, null, options, false, userId, null, null); }
此處mStackSupervisor的數據類型為ActivityStackSupervisor
2.7 ASS.startActivityMayWait
當程序運行到這里時, ASS.startActivityMayWait的各個參數取值如下:
- caller = ApplicationThreadProxy, 用於跟調用者進程ApplicationThread進行通信的binder代理類.
- callingUid = -1;
- callingPackage = ContextImpl.getBasePackageName(),獲取調用者Activity所在包名
- intent: 這是啟動Activity時傳遞過來的參數;
- resolvedType = intent.resolveTypeIfNeeded
- voiceSession = null;
- voiceInteractor = null;
- resultTo = Activity.mToken, 其中Activity是指調用者所在Activity, mToken對象保存自己所處的ActivityRecord信息
- resultWho = Activity.mEmbeddedID, 其中Activity是指調用者所在Activity
- requestCode = -1;
- startFlags = 0;
- profilerInfo = null;
- outResult = null;
- config = null;
- options = null;
- ignoreTargetSecurity = false;
- userId = AMS.handleIncomingUser, 當調用者userId跟當前處於同一個userId,則直接返回該userId;當不相等時則根據調用者userId來決定是否需要將callingUserId轉換為mCurrentUserId.
- iContainer = null;
- inTask = null;
再來看看這個方法的源碼:
[-> ActivityStackSupervisor.java]
final int startActivityMayWait(IApplicationThread caller, int callingUid, String callingPackage, Intent intent, String resolvedType, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, WaitResult outResult, Configuration config, Bundle options, boolean ignoreTargetSecurity, int userId, IActivityContainer iContainer, TaskRecord inTask) { ... boolean componentSpecified = intent.getComponent() != null; //創建新的Intent對象,即便intent被修改也不受影響 intent = new Intent(intent); //收集Intent所指向的Activity信息, 當存在多個可供選擇的Activity,則直接向用戶彈出resolveActivity [見2.7.1] ActivityInfo aInfo = resolveActivity(intent, resolvedType, startFlags, profilerInfo, userId); ActivityContainer container = (ActivityContainer)iContainer; synchronized (mService) { if (container != null && container.mParentActivity != null && container.mParentActivity.state != RESUMED) { ... //不進入該分支, container == nul } final int realCallingPid = Binder.getCallingPid(); final int realCallingUid = Binder.getCallingUid(); int callingPid; if (callingUid >= 0) { callingPid = -1; } else if (caller == null) { callingPid = realCallingPid; callingUid = realCallingUid; } else { callingPid = callingUid = -1; } final ActivityStack stack; if (container == null || container.mStack.isOnHomeDisplay()) { stack = mFocusedStack; // 進入該分支 } else { stack = container.mStack; } //此時mConfigWillChange = false stack.mConfigWillChange = config != null && mService.mConfiguration.diff(config) != 0; final long origId = Binder.clearCallingIdentity(); if (aInfo != null && (aInfo.applicationInfo.privateFlags &ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE) != 0) { // heavy-weight進程處理流程, 一般情況下不進入該分支 if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) { ... } } //[見流程2.8] int res = startActivityLocked(caller, intent, resolvedType, aInfo, voiceSession, voiceInteractor, resultTo, resultWho, requestCode, callingPid, callingUid, callingPackage, realCallingPid, realCallingUid, startFlags, options, ignoreTargetSecurity, componentSpecified, null, container, inTask); Binder.restoreCallingIdentity(origId); if (stack.mConfigWillChange) { ... //不進入該分支 } if (outResult != null) { ... //不進入該分支 } return res; } }
該過程主要功能:通過resolveActivity來獲取ActivityInfo信息, 然后再進入ASS.startActivityLocked().先來看看
2.7.1 ASS.resolveActivity
// startFlags = 0; profilerInfo = null; userId代表caller UserId ActivityInfo resolveActivity(Intent intent, String resolvedType, int startFlags, ProfilerInfo profilerInfo, int userId) { ActivityInfo aInfo; ResolveInfo rInfo = AppGlobals.getPackageManager().resolveIntent( intent, resolvedType, PackageManager.MATCH_DEFAULT_ONLY | ActivityManagerService.STOCK_PM_FLAGS, userId); aInfo = rInfo != null ? rInfo.activityInfo : null; if (aInfo != null) { intent.setComponent(new ComponentName( aInfo.applicationInfo.packageName, aInfo.name)); if (!aInfo.processName.equals("system")) { ... //對於非system進程,根據flags來設置相應的debug信息 } } return aInfo; }
ActivityManager類有如下4個flags用於調試:
- START_FLAG_DEBUG:用於調試debug app
- START_FLAG_OPENGL_TRACES:用於調試OpenGL tracing
- START_FLAG_NATIVE_DEBUGGING:用於調試native
- START_FLAG_TRACK_ALLOCATION: 用於調試allocation tracking
2.7.2 PKMS.resolveIntent
AppGlobals.getPackageManager()經過函數層層調用,獲取的是ApplicationPackageManager對象。經過binder IPC調用,最終會調用PackageManagerService對象。故此時調用方法為PMS.resolveIntent().
[-> PackageManagerService.java]
public ResolveInfo resolveIntent(Intent intent, String resolvedType, int flags, int userId) { if (!sUserManager.exists(userId)) return null; enforceCrossUserPermission(Binder.getCallingUid(), userId, false, false, "resolve intent"); //[見流程2.7.3] List<ResolveInfo> query = queryIntentActivities(intent, resolvedType, flags, userId); //根據priority,preferred選擇最佳的Activity return chooseBestActivity(intent, resolvedType, flags, query, userId); }
2.7.3 PMS.queryIntentActivities
public List<ResolveInfo> queryIntentActivities(Intent intent, String resolvedType, int flags, int userId) { ... ComponentName comp = intent.getComponent(); if (comp == null) { if (intent.getSelector() != null) { intent = intent.getSelector(); comp = intent.getComponent(); } } if (comp != null) { final List<ResolveInfo> list = new ArrayList<ResolveInfo>(1); //獲取Activity信息 final ActivityInfo ai = getActivityInfo(comp, flags, userId); if (ai != null) { final ResolveInfo ri = new ResolveInfo(); ri.activityInfo = ai; list.add(ri); } return list; } ... }
ASS.resolveActivity()方法的核心功能是找到相應的Activity組件,並保存到intent對象。
2.8 ASS.startActivityLocked
[-> ActivityStackSupervisor.java]
final int startActivityLocked(IApplicationThread caller, Intent intent, String resolvedType, ActivityInfo aInfo, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid, String callingPackage, int realCallingPid, int realCallingUid, int startFlags, Bundle options, boolean ignoreTargetSecurity, boolean componentSpecified, ActivityRecord[] outActivity, ActivityContainer container, TaskRecord inTask) { int err = ActivityManager.START_SUCCESS; //獲取調用者的進程記錄對象 ProcessRecord callerApp = null; if (caller != null) { callerApp = mService.getRecordForAppLocked(caller); if (callerApp != null) { callingPid = callerApp.pid; callingUid = callerApp.info.uid; } else { err = ActivityManager.START_PERMISSION_DENIED; } } final int userId = aInfo != null ? UserHandle.getUserId(aInfo.applicationInfo.uid) : 0; ActivityRecord sourceRecord = null; ActivityRecord resultRecord = null; if (resultTo != null) { //獲取調用者所在的Activity sourceRecord = isInAnyStackLocked(resultTo); if (sourceRecord != null) { if (requestCode >= 0 && !sourceRecord.finishing) { ... //requestCode = -1 則不進入 } } } final int launchFlags = intent.getFlags(); if ((launchFlags & Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0 && sourceRecord != null) { ... // activity執行結果的返回由源Activity轉換到新Activity, 不需要返回結果則不會進入該分支 } if (err == ActivityManager.START_SUCCESS && intent.getComponent() == null) { //從Intent中無法找到相應的Component err = ActivityManager.START_INTENT_NOT_RESOLVED; } if (err == ActivityManager.START_SUCCESS && aInfo == null) { //從Intent中無法找到相應的ActivityInfo err = ActivityManager.START_INTENT_NOT_RESOLVED; } if (err == ActivityManager.START_SUCCESS && !isCurrentProfileLocked(userId) && (aInfo.flags & FLAG_SHOW_FOR_ALL_USERS) == 0) { //嘗試啟動一個后台Activity, 但該Activity對當前用戶不可見 err = ActivityManager.START_NOT_CURRENT_USER_ACTIVITY; } ... //執行后resultStack = null final ActivityStack resultStack = resultRecord == null ? null : resultRecord.task.stack; ... //權限檢查 // ActivityController不為空的情況,比如monkey測試過程 if (mService.mController != null) { Intent watchIntent = intent.cloneFilter(); abort |= !mService.mController.activityStarting(watchIntent, aInfo.applicationInfo.packageName); } if (abort) { ... //權限檢查不滿足,才進入該分支則直接返回; return ActivityManager.START_SUCCESS; } // 創建Activity記錄對象 ActivityRecord r = new ActivityRecord(mService, callerApp, callingUid, callingPackage, intent, resolvedType, aInfo, mService.mConfiguration, resultRecord, resultWho, requestCode, componentSpecified, voiceSession != null, this, container, options); if (outActivity != null) { outActivity[0] = r; } if (r.appTimeTracker == null && sourceRecord != null) { r.appTimeTracker = sourceRecord.appTimeTracker; } // 將mFocusedStack賦予當前stack final ActivityStack stack = mFocusedStack; if (voiceSession == null && (stack.mResumedActivity == null || stack.mResumedActivity.info.applicationInfo.uid != callingUid)) { // 前台stack還沒有resume狀態的Activity時, 則檢查app切換是否允許 [見流程2.8.1] if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid, realCallingPid, realCallingUid, "Activity start")) { PendingActivityLaunch pal = new PendingActivityLaunch(r, sourceRecord, startFlags, stack); // 當不允許切換,則把要啟動的Activity添加到mPendingActivityLaunches對象, 並且直接返回. mPendingActivityLaunches.add(pal); ActivityOptions.abort(options); return ActivityManager.START_SWITCHES_CANCELED; } } if (mService.mDidAppSwitch) { //從上次禁止app切換以來,這是第二次允許app切換,因此將允許切換時間設置為0,則表示可以任意切換app mService.mAppSwitchesAllowedTime = 0; } else { mService.mDidAppSwitch = true; } //處理 pendind Activity的啟動, 這些Activity是由於app switch禁用從而被hold的等待啟動activity [見流程2.8.2] doPendingActivityLaunchesLocked(false); //[見流程2.9] err = startActivityUncheckedLocked(r, sourceRecord, voiceSession, voiceInteractor, startFlags, true, options, inTask); if (err < 0) { notifyActivityDrawnForKeyguard(); } return err; }
其中有兩個返回值代表啟動Activity失敗:
- START_INTENT_NOT_RESOLVED: 從Intent中無法找到相應的Component或者ActivityInfo
- START_NOT_CURRENT_USER_ACTIVITY:該Activity對當前用戶不可見
2.8.1 AMS.checkAppSwitchAllowedLocked
boolean checkAppSwitchAllowedLocked(int sourcePid, int sourceUid, int callingPid, int callingUid, String name) { if (mAppSwitchesAllowedTime < SystemClock.uptimeMillis()) { return true; } int perm = checkComponentPermission( android.Manifest.permission.STOP_APP_SWITCHES, sourcePid, sourceUid, -1, true); if (perm == PackageManager.PERMISSION_GRANTED) { return true; } if (callingUid != -1 && callingUid != sourceUid) { perm = checkComponentPermission( android.Manifest.permission.STOP_APP_SWITCHES, callingPid, callingUid, -1, true); if (perm == PackageManager.PERMISSION_GRANTED) { return true; } } return false; }
當mAppSwitchesAllowedTime時間小於當前時長,或者具有STOP_APP_SWITCHES的權限,則允許app發生切換操作.
其中mAppSwitchesAllowedTime, 在AMS.stopAppSwitches()
的過程中會設置為:mAppSwitchesAllowedTime = SystemClock.uptimeMillis() + APP_SWITCH_DELAY_TIME
. 禁止app切換的timeout時長為5s(APP_SWITCH_DELAY_TIME = 5s).
當發送5秒超時或者執行AMS.resumeAppSwitches()
過程會將mAppSwitchesAllowedTime設置0, 都會開啟允許app執行切換的操作.另外,禁止App切換的操作,對於同一個app是不受影響的,有興趣可以進一步查看checkComponentPermission
過程.
2.8.2 ASS.doPendingActivityLaunchesLocked
[-> ActivityStackSupervisor.java]
final void doPendingActivityLaunchesLocked(boolean doResume) { while (!mPendingActivityLaunches.isEmpty()) { PendingActivityLaunch pal = mPendingActivityLaunches.remove(0); try { //[見流程2.9] startActivityUncheckedLocked(pal.r, pal.sourceRecord, null, null, pal.startFlags, doResume && mPendingActivityLaunches.isEmpty(), null, null); } catch (Exception e) { ... } } }
mPendingActivityLaunches
記錄着所有將要啟動的Activity, 是由於在startActivityLocked
的過程時App切換功能被禁止, 也就是不運行切換Activity, 那么此時便會把相應的Activity加入到mPendingActivityLaunches
隊列. 該隊列的成員在執行完doPendingActivityLaunchesLocked
便會清空.
啟動mPendingActivityLaunches中所有的Activity, 由於doResume = false, 那么這些activtity並不會進入resume狀態,而是設置delayedResume = true, 會延遲resume.
2.9 ASS.startActivityUncheckedLocked
[-> ActivityStackSupervisor.java]
// sourceRecord是指調用者, r是指本次將要啟動的Activity final int startActivityUncheckedLocked(final ActivityRecord r, ActivityRecord sourceRecord, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, int startFlags, boolean doResume, Bundle options, TaskRecord inTask) { final Intent intent = r.intent; final int callingUid = r.launchedFromUid; if (inTask != null && !inTask.inRecents) { inTask = null; } final boolean launchSingleTop = r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP; final boolean launchSingleInstance = r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE; final boolean launchSingleTask = r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK; int launchFlags = intent.getFlags(); // 當intent和activity manifest存在沖突,則manifest優先 if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0 && (launchSingleInstance || launchSingleTask)) { launchFlags &= ~(Intent.FLAG_ACTIVITY_NEW_DOCUMENT | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); } else { ... } final boolean launchTaskBehind = r.mLaunchTaskBehind && !launchSingleTask && !launchSingleInstance && (launchFlags & Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0; if (r.resultTo != null && (launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0 && r.resultTo.task.stack != null) { r.resultTo.task.stack.sendActivityResultLocked(-1, r.resultTo, r.resultWho, r.requestCode, Activity.RESULT_CANCELED, null); r.resultTo = null; } if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0 && r.resultTo == null) { launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; } if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { if (launchTaskBehind || r.info.documentLaunchMode == ActivityInfo.DOCUMENT_LAUNCH_ALWAYS) { launchFlags |= Intent.FLAG_ACTIVITY_MULTIPLE_TASK; } } mUserLeaving = (launchFlags & Intent.FLAG_ACTIVITY_NO_USER_ACTION) == 0; //當本次不需要resume,則設置為延遲resume的狀態 if (!doResume) { r.delayedResume = true; } ActivityRecord notTop = (launchFlags & Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP) != 0 ? r : null; if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) { ActivityRecord checkedCaller = sourceRecord; if (checkedCaller == null) { checkedCaller = mFocusedStack.topRunningNonDelayedActivityLocked(notTop); } if (!checkedCaller.realActivity.equals(r.realActivity)) { //調用者 與將要啟動的Activity不相同時,進入該分支。 startFlags &= ~ActivityManager.START_FLAG_ONLY_IF_NEEDED; } } boolean addingToTask = false; TaskRecord reuseTask = null; //當調用者不是來自activity,而是明確指定task的情況。 if (sourceRecord == null && inTask != null && inTask.stack != null) { ... //目前sourceRecord不為空,則不進入該分支 } else { inTask = null; } if (inTask == null) { if (sourceRecord == null) { //調用者並不是Activity context,則強制創建新task if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) == 0 && inTask == null) { launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; } } else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { //調用者activity帶有single instance,則創建新task launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; } else if (launchSingleInstance || launchSingleTask) { //目標activity帶有single instance或者single task,則創建新task launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; } } ActivityInfo newTaskInfo = null; Intent newTaskIntent = null; ActivityStack sourceStack; if (sourceRecord != null) { if (sourceRecord.finishing) { //調用者處於即將finish狀態,則創建新task if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; newTaskInfo = sourceRecord.info; newTaskIntent = sourceRecord.task.intent; } sourceRecord = null; sourceStack = null; } else { //當調用者Activity不為空,且不處於finishing狀態,則其所在棧賦於sourceStack sourceStack = sourceRecord.task.stack; } } else { sourceStack = null; } boolean movedHome = false; ActivityStack targetStack; intent.setFlags(launchFlags); final boolean noAnimation = (launchFlags & Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0; if (((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0 && (launchFlags & Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0) || launchSingleInstance || launchSingleTask) { if (inTask == null && r.resultTo == null) { //從mActivityDisplays開始查詢是否有相應ActivityRecord ActivityRecord intentActivity = !launchSingleInstance ? findTaskLocked(r) : findActivityLocked(intent, r.info); if (intentActivity != null) { if (isLockTaskModeViolation(intentActivity.task, (launchFlags & (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK)) == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK))) { return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION; } if (r.task == null) { r.task = intentActivity.task; } if (intentActivity.task.intent == null) { intentActivity.task.setIntent(r); } targetStack = intentActivity.task.stack; targetStack.mLastPausedActivity = null; final ActivityStack focusStack = getFocusedStack(); ActivityRecord curTop = (focusStack == null) ? null : focusStack.topRunningNonDelayedActivityLocked(notTop); boolean movedToFront = false; if (curTop != null && (curTop.task != intentActivity.task || curTop.task != focusStack.topTask())) { r.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); if (sourceRecord == null || (sourceStack.topActivity() != null && sourceStack.topActivity().task == sourceRecord.task)) { if (launchTaskBehind && sourceRecord != null) { intentActivity.setTaskToAffiliateWith(sourceRecord.task); } movedHome = true; //將該task移至前台 targetStack.moveTaskToFrontLocked(intentActivity.task, noAnimation, options, r.appTimeTracker, "bringingFoundTaskToFront"); movedToFront = true; if ((launchFlags & (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME)) == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME)) { //將toReturnTo設置為home intentActivity.task.setTaskToReturnTo(HOME_ACTIVITY_TYPE); } options = null; } } if (!movedToFront) { targetStack.moveToFront("intentActivityFound"); } if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) { //重置目標task intentActivity = targetStack.resetTaskIfNeededLocked(intentActivity, r); } if ((startFlags & ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) { if (doResume) { resumeTopActivitiesLocked(targetStack, null, options); //當沒有啟動至前台,則通知Keyguard if (!movedToFront) { notifyActivityDrawnForKeyguard(); } } else { ActivityOptions.abort(options); } return ActivityManager.START_RETURN_INTENT_TO_CALLER; } if ((launchFlags & (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK)) == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK)) { reuseTask = intentActivity.task; //移除所有跟已存在的task有關聯的activity reuseTask.performClearTaskLocked(); reuseTask.setIntent(r); } else if ((launchFlags & FLAG_ACTIVITY_CLEAR_TOP) != 0 || launchSingleInstance || launchSingleTask) { ActivityRecord top = intentActivity.task.performClearTaskLocked(r, launchFlags); if (top != null) { if (top.frontOfTask) { top.task.setIntent(r); } //觸發onNewIntent() top.deliverNewIntentLocked(callingUid, r.intent, r.launchedFromPackage); } else { sourceRecord = intentActivity; TaskRecord task = sourceRecord.task; if (task != null && task.stack == null) { targetStack = computeStackFocus(sourceRecord, false /* newTask */); targetStack.addTask( task, !launchTaskBehind /* toTop */, false /* moving */); } } } else if (r.realActivity.equals(intentActivity.task.realActivity)) { if (((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 || launchSingleTop) && intentActivity.realActivity.equals(r.realActivity)) { if (intentActivity.frontOfTask) { intentActivity.task.setIntent(r); } //觸發onNewIntent() intentActivity.deliverNewIntentLocked(callingUid, r.intent, r.launchedFromPackage); } else if (!r.intent.filterEquals(intentActivity.task.intent)) { addingToTask = true; sourceRecord = intentActivity; } } else if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) == 0) { addingToTask = true; sourceRecord = intentActivity; } else if (!intentActivity.task.rootWasReset) { intentActivity.task.setIntent(r); } if (!addingToTask && reuseTask == null) { if (doResume) { targetStack.resumeTopActivityLocked(null, options); if (!movedToFront) { notifyActivityDrawnForKeyguard(); } } else { ActivityOptions.abort(options); } return ActivityManager.START_TASK_TO_FRONT; } } } } if (r.packageName != null) { //當啟動的activity跟前台顯示是同一個的情況 ActivityStack topStack = mFocusedStack; ActivityRecord top = topStack.topRunningNonDelayedActivityLocked(notTop); if (top != null && r.resultTo == null) { if (top.realActivity.equals(r.realActivity) && top.userId == r.userId) { if (top.app != null && top.app.thread != null) { if ((launchFlags & Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 || launchSingleTop || launchSingleTask) { topStack.mLastPausedActivity = null; if (doResume) { resumeTopActivitiesLocked(); } ActivityOptions.abort(options); if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) { } //觸發onNewIntent() top.deliverNewIntentLocked(callingUid, r.intent, r.launchedFromPackage); return ActivityManager.START_DELIVERED_TO_TOP; } } } } } else { if (r.resultTo != null && r.resultTo.task.stack != null) { r.resultTo.task.stack.sendActivityResultLocked(-1, r.resultTo, r.resultWho, r.requestCode, Activity.RESULT_CANCELED, null); } ActivityOptions.abort(options); return ActivityManager.START_CLASS_NOT_FOUND; } boolean newTask = false; boolean keepCurTransition = false; TaskRecord taskToAffiliate = launchTaskBehind && sourceRecord != null ? sourceRecord.task : null; if (r.resultTo == null && inTask == null && !addingToTask && (launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { newTask = true; targetStack = computeStackFocus(r, newTask); targetStack.moveToFront("startingNewTask"); if (reuseTask == null) { r.setTask(targetStack.createTaskRecord(getNextTaskId(), newTaskInfo != null ? newTaskInfo : r.info, newTaskIntent != null ? newTaskIntent : intent, voiceSession, voiceInteractor, !launchTaskBehind /* toTop */), taskToAffiliate); } else { r.setTask(reuseTask, taskToAffiliate); } if (isLockTaskModeViolation(r.task)) { return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION; } if (!movedHome) { if ((launchFlags & (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME)) == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME)) { r.task.setTaskToReturnTo(HOME_ACTIVITY_TYPE); } } } else if (sourceRecord != null) { final TaskRecord sourceTask = sourceRecord.task; if (isLockTaskModeViolation(sourceTask)) { return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION; } targetStack = sourceTask.stack; targetStack.moveToFront("sourceStackToFront"); final TaskRecord topTask = targetStack.topTask(); if (topTask != sourceTask) { targetStack.moveTaskToFrontLocked(sourceTask, noAnimation, options, r.appTimeTracker, "sourceTaskToFront"); } if (!addingToTask && (launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) { ActivityRecord top = sourceTask.performClearTaskLocked(r, launchFlags); keepCurTransition = true;