因爲源碼分析的代碼量比較大,大部分博客網站的內容顯示頁面都比較窄,顯示出來的效果都異常醜陋,因此您也能夠直接查看 《 Thinking in Android 》 來閱讀這邊文章,但願這篇文章能幫你梳理清楚應用的啓動流程。java
Source | Path |
---|---|
BaseDraggingActivity.java | packages/apps/Launcher3//src/com/android/launcher3/BaseDraggingActivity.java |
ItemClickHandler.java | packages/apps/Launcher3/src/com/android/launcher3/touch/ItemClickHandler.java |
Launcher.java | packages/apps/Launcher3/src/com/android/launcher3/Launcher.java |
Activity.java | frameworks/base/core/java/android/app/Activity.java |
ActivityManager.java | frameworks/base/core/java/android/app/ActivityManager.java |
ActivityTaskManager.java | frameworks/base/core/java/android/app/ActivityTaskManager.java |
ActivityThread.java | frameworks/base/core/java/android/app/ActivityThread.java |
ClientTransaction.java | frameworks/base/core/java/android/app/servertransaction/ClientTransaction.java |
ClientTransactionHandler.java | frameworks/base/core/java/android/app/ClientTransactionHandler.java |
ActivityManagerInternal.java | frameworks/base/core/java/android/app/ActivityManagerInternal.java |
Instrumentation.java | frameworks/base/core/java/android/app/Instrumentation.java |
LaunchActivityItem.java | frameworks/base/core/java/android/app/servertransaction/LaunchActivityItem.java |
PauseActivityItem.java | frameworks/base/core/java/android/app/servertransaction/PauseActivityItem.java |
Process.java | frameworks/base/core/java/android/os/Process.java |
TransactionExecutor.java | frameworks/base/core/java/android/app/servertransaction/TransactionExecutor.java |
ActivityManagerService.java | frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java |
ActivityTaskManagerService.java | frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java |
RootActivityContainer.java | frameworks/base/services/core/java/com/android/server/wm/RootActivityContainer.java |
ActivityStack.java | frameworks/base/services/core/java/com/android/server/wm/ActivityStack.java |
ActivityStarter.java | frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.java |
ActivityStartController.java | frameworks/base/services/core/java/com/android/server/wm/ActivityStartController.java |
ActivityStackSupervisor.java | frameworks/base/services/core/java/com/android/server/wm/ActivityStackSupervisor.java |
ClientLifecycleManager.java | frameworks/base/services/core/java/com/android/server/wm/ClientLifecycleManager.java |
ProcessList.java | frameworks/base/services/core/java/com/android/server/am/ProcessList.java |
ActivityTaskManagerInternal.java | frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java |
點擊 Launcher 界面的應用圖標,運行各類眼花繚亂,功能強大的應用,是咱們的平常行爲,做爲一名系統工程師,很是有必要深刻研究一下:當咱們點擊 APK 圖標,直到應用的主界面最後顯示出來,這期間從源碼角度到底發生了什麼,處理邏輯是什麼樣的?
android
這個流程我的以爲是很是必要深入理解的,好比有時當咱們點擊應用出現了 卡頓
、黑白屏
現象,這些是應用自己的問題,仍是系統的問題?當你分析此類問題的時候,若是對 Activity 的啓動流程不熟悉,分析起來會狠吃力,而且未必能深刻分析獲得最根本的緣由。windows
廢話很少說,爲了更方便而且細緻的分析源碼流程,咱們選取 Launcher 界面點擊應用
爲切入點進行分析(經過一個特定場景/操做是研究源碼最好的作法),接下來直接進入正題。promise
咱們既然要啓動新的 APK 置於前臺,那麼當前活動必然要被切換到後臺,因此首先涉及到的就是 Launcher 的 onPause
流程。app
當點擊應用程序 Launcher 的某個圖標時,會觸發回調接口 ItemClickHandler
。async
// packages/apps/Launcher3/src/com/android/launcher3/Launcher.java public class Launcher extends BaseDraggingActivity implements LauncherExterns, Callbacks, LauncherProviderChangeListener, UserEventDelegate, InvariantDeviceProfile.OnIDPChangeListener { public View createShortcut(ViewGroup parent, WorkspaceItemInfo info) { BubbleTextView favorite = (BubbleTextView) LayoutInflater.from(parent.getContext()) .inflate(R.layout.app_icon, parent, false); favorite.applyFromWorkspaceItem(info); favorite.setOnClickListener(ItemClickHandler.INSTANCE); // 觸發 favorite.setOnFocusChangeListener(mFocusHandler); return favorite; } }
回調接口 ItemClickHandler
會執行 onClick()
方法中的 startAppShortcutOrInfoActivity()
。ide
// packages/apps/Launcher3/src/com/android/launcher3/touch/ItemClickHandler.java public class ItemClickHandler { public static final OnClickListener INSTANCE = getInstance(null); public static final OnClickListener getInstance(String sourceContainer) { return v -> onClick(v, sourceContainer); } private static void onClick(View v, String sourceContainer) { ... ... Object tag = v.getTag(); if (tag instanceof WorkspaceItemInfo) { onClickAppShortcut(v, (WorkspaceItemInfo) tag, launcher, sourceContainer); } else if (tag instanceof FolderInfo) { if (v instanceof FolderIcon) { onClickFolderIcon(v); } } else if (tag instanceof AppInfo) { // 調用 startAppShortcutOrInfoActivity() 方法 startAppShortcutOrInfoActivity(v, (AppInfo) tag, launcher, sourceContainer == null ? CONTAINER_ALL_APPS: sourceContainer); } else if (tag instanceof LauncherAppWidgetInfo) { if (v instanceof PendingAppWidgetHostView) { onClickPendingWidget((PendingAppWidgetHostView) v, launcher); } } } private static void startAppShortcutOrInfoActivity(View v, ItemInfo item, Launcher launcher, @Nullable String sourceContainer) { Intent intent; if (item instanceof PromiseAppInfo) { PromiseAppInfo promiseAppInfo = (PromiseAppInfo) item; intent = promiseAppInfo.getMarketIntent(launcher); } else { intent = item.getIntent(); } if (intent == null) { throw new IllegalArgumentException("Input must have a valid intent"); } if (item instanceof WorkspaceItemInfo) { WorkspaceItemInfo si = (WorkspaceItemInfo) item; if (si.hasStatusFlag(WorkspaceItemInfo.FLAG_SUPPORTS_WEB_UI) && Intent.ACTION_VIEW.equals(intent.getAction())) { intent = new Intent(intent); intent.setPackage(null); } } if (v != null && launcher.getAppTransitionManager().supportsAdaptiveIconAnimation()) { FloatingIconView.fetchIcon(launcher, v, item, true /* isOpening */); } // 調用 startActivitySafely() 方法 launcher.startActivitySafely(v, intent, item, sourceContainer); } }
// packages/apps/Launcher3/src/com/android/launcher3/Launcher.java public class Launcher extends BaseDraggingActivity implements LauncherExterns, Callbacks, LauncherProviderChangeListener, UserEventDelegate, InvariantDeviceProfile.OnIDPChangeListener { public boolean startActivitySafely(View v, Intent intent, ItemInfo item, @Nullable String sourceContainer) { if (!hasBeenResumed()) { addOnResumeCallback(() -> startActivitySafely(v, intent, item, sourceContainer)); UiFactory.clearSwipeSharedState(true /* finishAnimation */); return true; } // 調用父類 BaseDraggingActivity 的 startActivitySafely() 方法 boolean success = super.startActivitySafely(v, intent, item, sourceContainer); if (success && v instanceof BubbleTextView) { BubbleTextView btv = (BubbleTextView) v; btv.setStayPressed(true); addOnResumeCallback(btv); } return success; // 表示啓動新應用程序的 Activity 成功 } }
// packages/apps/Launcher3/src/com/android/launcher3/BaseDraggingActivity.java public abstract class BaseDraggingActivity extends BaseActivity implements WallpaperColorInfo.OnChangeListener { public boolean startActivitySafely(View v, Intent intent, @Nullable ItemInfo item, @Nullable String sourceContainer) { ... ... // 添加標誌,表示要在一個新的 Task 中啓動這個 Activity intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (v != null) { intent.setSourceBounds(getViewBounds(v)); } try { boolean isShortcut = (item instanceof WorkspaceItemInfo) && (item.itemType == Favorites.ITEM_TYPE_SHORTCUT || item.itemType == Favorites.ITEM_TYPE_DEEP_SHORTCUT) && !((WorkspaceItemInfo) item).isPromise(); if (isShortcut) { // Shortcuts need some special checks due to legacy reasons. startShortcutIntentSafely(intent, optsBundle, item, sourceContainer); } else if (user == null || user.equals(Process.myUserHandle())) { // 調用 Activity.startActivity() 方法 startActivity(intent, optsBundle); AppLaunchTracker.INSTANCE.get(this).onStartApp(intent.getComponent(), Process.myUserHandle(), sourceContainer); } else { LauncherAppsCompat.getInstance(this).startActivityForProfile( intent.getComponent(), user, intent.getSourceBounds(), optsBundle); AppLaunchTracker.INSTANCE.get(this).onStartApp(intent.getComponent(), user, sourceContainer); } getUserEventDispatcher().logAppLaunch(v, intent); getStatsLogManager().logAppLaunch(v, intent); return true; } catch (NullPointerException|ActivityNotFoundException|SecurityException e) { Toast.makeText(this, R.string.activity_not_found, Toast.LENGTH_SHORT).show(); Log.e(TAG, "Unable to launch. tag=" + item + " intent=" + intent, e); } return false; } }
// framework/base/core/java/android/app/Activity.java public class Activity extends ContextThemeWrapper implements LayoutInflater.Factory2, Window.Callback, KeyEvent.Callback, OnCreateContextMenuListener, ComponentCallbacks2, Window.OnWindowDismissedCallback, WindowControllerCallback, AutofillManager.AutofillClient, ContentCaptureManager.ContentCaptureClient { @Override public void startActivity(Intent intent, @Nullable Bundle options) { if (options != null) { // options 表示 Launcher 啓動 Activity 時的動畫效果 startActivityForResult(intent, -1, options); } else { // Note we want to go through this call for compatibility with // applications that may have overridden the method. startActivityForResult(intent, -1); } } }
// framework/base/core/java/android/app/Activity.java public class Activity extends ContextThemeWrapper implements LayoutInflater.Factory2, Window.Callback, KeyEvent.Callback, OnCreateContextMenuListener, ComponentCallbacks2, Window.OnWindowDismissedCallback, WindowControllerCallback, AutofillManager.AutofillClient, ContentCaptureManager.ContentCaptureClient { private Instrumentation mInstrumentation; /*package*/ ActivityThread mMainThread; public void startActivityForResult(@RequiresPermission Intent intent, int requestCode, @Nullable Bundle options) { // mParent 表明目前 Launcher Activity 的狀態,第一次啓動 Activity,走此條分支 if (mParent == null) { options = transferSpringboardActivityOptions(options); Instrumentation.ActivityResult ar = // 執行 mInstrumentation.execStartActivity() 方法 mInstrumentation.execStartActivity( this, mMainThread.getApplicationThread(), mToken, this, intent, requestCode, options); if (ar != null) { mMainThread.sendActivityResult( mToken, mEmbeddedID, requestCode, ar.getResultCode(), ar.getResultData()); } if (requestCode >= 0) { mStartedActivity = true; } cancelInputsAndStartExitTransition(options); } else { if (options != null) { // 最終也會調用 mInstrumentation.execStartActivity() 方法 mParent.startActivityFromChild(this, intent, requestCode, options); } else { mParent.startActivityFromChild(this, intent, requestCode); } } } }
mInstrumentation.execStartActivity()
方法中有一個 mMainThread.getApplicationThread()
參數,mMainThread
是 Activity
類的 成員變量
,它的類型是 ActivityThread
,它表明的是應用程序的 主線程
。oop
// frameworks/base/core/java/android/app/ActivityThread.java public final class ActivityThread extends ClientTransactionHandler { final ApplicationThread mAppThread = new ApplicationThread(); private class ApplicationThread extends IApplicationThread.Stub {...} public ApplicationThread getApplicationThread() { return mAppThread; } }
mMainThread.getApplicationThread()
得到的是 ActivityThread
內部成員變量 ApplicationThread
,它是一個 Binder
對象。這個對象是幹嗎用的,咱們後面會講解到。源碼分析
Instrumentation
是 Android 系統中啓動 Activity
的一個實際操做類,它用來監控應用程序和系統的交互。佈局
// frameworks/base/core/java/android/app/Instrumentation.java public class Instrumentation { public ActivityResult execStartActivity( Context who, IBinder contextThread, IBinder token, String target, Intent intent, int requestCode, Bundle options) { ... ... try { intent.migrateExtraStreamToClipData(); intent.prepareToLeaveProcess(who); // 調用 ActivityTaskManager.getService().startActivity() 方法 int result = ActivityTaskManager.getService() .startActivity(whoThread, who.getBasePackageName(), intent, intent.resolveTypeIfNeeded(who.getContentResolver()), token, target, requestCode, 0, null, options); checkStartActivityResult(result, intent); } catch (RemoteException e) { throw new RuntimeException("Failure from system", e); } return null; } }
看下 ActivityTaskManager.getService()
方法:
// frameworks/base/core/java/android/app/ActivityTaskManager.java public class ActivityTaskManager { public static IActivityTaskManager getService() { return IActivityTaskManagerSingleton.get(); // 獲取 IActivityTaskManager 單例 } private static final Singleton<IActivityTaskManager> IActivityTaskManagerSingleton = new Singleton<IActivityTaskManager>() { @Override protected IActivityTaskManager create() { final IBinder b = ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE); return IActivityTaskManager.Stub.asInterface(b); } }; } // frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java public class ActivityTaskManagerService extends IActivityTaskManager.Stub {}
咱們發現 ActivityTaskManagerService
與 ActivityTaskManager
的 Binder 通訊採用了 AIDL
的方式。
ActivityTaskManager.getService().startActivity()
方法實際上調用到了 ActivityTaskManagerService
的 startActivity()
方法。
下面看看 ActivityManagerService
的 startActivity
方法:
// frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java public class ActivityTaskManagerService extends IActivityTaskManager.Stub { @Override public final int startActivity(IApplicationThread caller, String callingPackage, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle bOptions) { // 調轉到 startActivityAsUser() 方法 return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo, resultWho, requestCode, startFlags, profilerInfo, bOptions, UserHandle.getCallingUserId()); } }
// frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java public class ActivityTaskManagerService extends IActivityTaskManager.Stub { ActivityStartController getActivityStartController() { return mActivityStartController; } @Override public int startActivityAsUser(IApplicationThread caller, String callingPackage, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId) { return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo, resultWho, requestCode, startFlags, profilerInfo, bOptions, userId, true /*validateIncomingUser*/); } int startActivityAsUser(IApplicationThread caller, String callingPackage, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId, boolean validateIncomingUser) { enforceNotIsolatedCaller("startActivityAsUser"); userId = getActivityStartController().checkTargetUser(userId, validateIncomingUser, Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser"); // TODO: Switch to user app stacks here. return getActivityStartController().obtainStarter(intent, "startActivityAsUser") .setCaller(caller) .setCallingPackage(callingPackage) .setResolvedType(resolvedType) .setResultTo(resultTo) .setResultWho(resultWho) .setRequestCode(requestCode) .setStartFlags(startFlags) .setProfilerInfo(profilerInfo) .setActivityOptions(bOptions) .setMayWait(userId) // 設置了 mRequest.mayWait = true,後面會用到 .execute(); } }
// frameworks/base/services/core/java/com/android/server/wm/ActivityStartController.java import com.android.server.am.ActivityStarter.Factory; public class ActivityStartController { private final Factory mFactory; ActivityStarter obtainStarter(Intent intent, String reason) { // obtain()、setIntent()、setReason() 分別幹了什麼,下面一一說明 return mFactory.obtain().setIntent(intent).setReason(reason); } }
這邊用到了工廠模式,咱們跟一下具體的處理流程。
mFactory.obtain() - -> DefaultFactory.obtain()
// frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java class ActivityStarter { interface Factory { void setController(ActivityStartController controller); ActivityStarter obtain(); void recycle(ActivityStarter starter); } // DefaultFactory 爲實現類 static class DefaultFactory implements Factory { @Override public ActivityStarter obtain() { ActivityStarter starter = mStarterPool.acquire(); if (starter == null) { // obtain() 方法最終返回的是 ActivityStarter 的實例 starter = new ActivityStarter(mController, mService, mSupervisor, mInterceptor); } return starter; } } }
mFactory.obtain().setIntent() - -> ActivityStarter.setIntent()
// frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java class ActivityStarter { private Request mRequest = new Request(); ActivityStarter setIntent(Intent intent) { mRequest.intent = intent; // 爲 mRequest 賦值 return this; } }
mFactory.obtain().setIntent(intent).setReason() - ->ActivityStarter.setReason()
// frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java class ActivityStarter { private Request mRequest = new Request(); ActivityStarter setReason(String reason) { mRequest.reason = reason; // 爲 mRequest 賦值 return this; } }
getActivityStartController().obtainStarter()
方法最終得到一個包含全部啓動信息的 ActivityStarter
對象,而後做了各類賦值處理,最後執行 execute()
方法。
// frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java class ActivityStarter { // 上面咱們提到了執行過 setMayWait(userId) 方法 ActivityStarter setMayWait(int userId) { mRequest.mayWait = true; mRequest.userId = userId; return this; } /** * Starts an activity based on the request parameters provided earlier. * @return The starter result. */ int execute() { try { if (mRequest.mayWait) { // setMayWait() 方法中置爲 true return startActivityMayWait(mRequest.caller, mRequest.callingUid, mRequest.callingPackage, mRequest.realCallingPid, mRequest.realCallingUid, mRequest.intent, mRequest.resolvedType, mRequest.voiceSession, mRequest.voiceInteractor, mRequest.resultTo, mRequest.resultWho, mRequest.requestCode, mRequest.startFlags, mRequest.profilerInfo, mRequest.waitResult, mRequest.globalConfig, mRequest.activityOptions, mRequest.ignoreTargetSecurity, mRequest.userId, mRequest.inTask, mRequest.reason, mRequest.allowPendingRemoteAnimationRegistryLookup, mRequest.originatingPendingIntent, mRequest.allowBackgroundActivityStart); } else { return startActivity(mRequest.caller, mRequest.intent, mRequest.ephemeralIntent, mRequest.resolvedType, mRequest.activityInfo, mRequest.resolveInfo, mRequest.voiceSession, mRequest.voiceInteractor, mRequest.resultTo, mRequest.resultWho, mRequest.requestCode, mRequest.callingPid, mRequest.callingUid, mRequest.callingPackage, mRequest.realCallingPid, mRequest.realCallingUid, mRequest.startFlags, mRequest.activityOptions, mRequest.ignoreTargetSecurity, mRequest.componentSpecified, mRequest.outActivity, mRequest.inTask, mRequest.reason, mRequest.allowPendingRemoteAnimationRegistryLookup, mRequest.originatingPendingIntent, mRequest.allowBackgroundActivityStart); } } finally { onExecutionComplete(); } } }
因爲代碼追蹤起來比較繞,咱們分段經過流程圖回顧下方法調用邏輯。
// frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java class ActivityStarter { private int startActivityMayWait(IApplicationThread caller, int callingUid, String callingPackage, int requestRealCallingPid, int requestRealCallingUid, Intent intent, String resolvedType, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, WaitResult outResult, Configuration globalConfig, SafeActivityOptions options, boolean ignoreTargetSecurity, int userId, TaskRecord inTask, String reason, boolean allowPendingRemoteAnimationRegistryLookup, PendingIntentRecord originatingPendingIntent, boolean allowBackgroundActivityStart) { ... ... // 解析 Intent 的數據 ResolveInfo rInfo = mSupervisor.resolveIntent(intent, resolvedType, userId, 0 /* matchFlags */, computeResolveFilterUid( callingUid, realCallingUid, mRequest.filterCallingUid)); ... ... // 收集 intent 中的相關信息 ActivityInfo aInfo = mSupervisor.resolveActivity(intent, rInfo, startFlags, profilerInfo); synchronized (mService.mGlobalLock) { ... ... // 用於記錄 Activity 的數據 final ActivityRecord[] outRecord = new ActivityRecord[1]; // 啓動 Activity int res = startActivity(caller, intent, ephemeralIntent, resolvedType, aInfo, rInfo, voiceSession, voiceInteractor, resultTo, resultWho, requestCode, callingPid, callingUid, callingPackage, realCallingPid, realCallingUid, startFlags, options, ignoreTargetSecurity, componentSpecified, outRecord, inTask, reason, allowPendingRemoteAnimationRegistryLookup, originatingPendingIntent, allowBackgroundActivityStart); Binder.restoreCallingIdentity(origId); ... ... mSupervisor.getActivityMetricsLogger().notifyActivityLaunched(res, outRecord[0]); ... ... return res; } } }
// frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java class ActivityStarter { private int startActivity(IApplicationThread caller, Intent intent, Intent ephemeralIntent, String resolvedType, ActivityInfo aInfo, ResolveInfo rInfo, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid, String callingPackage, int realCallingPid, int realCallingUid, int startFlags, SafeActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified, ActivityRecord[] outActivity, TaskRecord inTask, String reason, boolean allowPendingRemoteAnimationRegistryLookup, PendingIntentRecord originatingPendingIntent, boolean allowBackgroundActivityStart) { ... ... // 調用 startActivity() 方法 mLastStartActivityResult = startActivity(caller, intent, ephemeralIntent, resolvedType, aInfo, rInfo, voiceSession, voiceInteractor, resultTo, resultWho, requestCode, callingPid, callingUid, callingPackage, realCallingPid, realCallingUid, startFlags, options, ignoreTargetSecurity, componentSpecified, mLastStartActivityRecord, inTask, allowPendingRemoteAnimationRegistryLookup, originatingPendingIntent, allowBackgroundActivityStart); ... ... return getExternalResult(mLastStartActivityResult); } }
// frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java class ActivityStarter { private int startActivity(IApplicationThread caller, Intent intent, Intent ephemeralIntent, String resolvedType, ActivityInfo aInfo, ResolveInfo rInfo, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid, String callingPackage, int realCallingPid, int realCallingUid, int startFlags, SafeActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified, ActivityRecord[] outActivity, TaskRecord inTask, boolean allowPendingRemoteAnimationRegistryLookup, PendingIntentRecord originatingPendingIntent, boolean allowBackgroundActivityStart) { ... ... final int res = startActivity(r, sourceRecord, voiceSession, voiceInteractor, startFlags, true /* doResume */, checkedOptions, inTask, outActivity, restrictedBgActivity); ... ... } }
// frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java class ActivityStarter { private int startActivity(final ActivityRecord r, ActivityRecord sourceRecord, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask, ActivityRecord[] outActivity, boolean restrictedBgActivity) { ... ... int result = START_CANCELED; final ActivityStack startedActivityStack; try { // 暫停佈局 mService.mWindowManager.deferSurfaceLayout(); // 調用 startActivityUnchecked() 方法 result = startActivityUnchecked(r, sourceRecord, voiceSession, voiceInteractor, startFlags, doResume, options, inTask, outActivity, restrictedBgActivity); } finally { final ActivityStack currentStack = r.getActivityStack(); startedActivityStack = currentStack != null ? currentStack : mTargetStack; if (ActivityManager.isStartResultSuccessful(result)) { if (startedActivityStack != null) { final ActivityRecord currentTop = startedActivityStack.topRunningActivityLocked(); if (currentTop != null && currentTop.shouldUpdateConfigForDisplayChanged()) { mRootActivityContainer.ensureVisibilityAndConfig( currentTop, currentTop.getDisplayId(), true /* markFrozenIfConfigChanged */, false /* deferResume */); } } } else { final ActivityStack stack = mStartActivity.getActivityStack(); if (stack != null) { stack.finishActivityLocked(mStartActivity, RESULT_CANCELED, null /* intentResultData */, "startActivity", true /* oomAdj */); } if (startedActivityStack != null && startedActivityStack.isAttached() && startedActivityStack.numActivities() == 0 && !startedActivityStack.isActivityTypeHome()) { startedActivityStack.remove(); } } // 繼續佈局 mService.mWindowManager.continueSurfaceLayout(); } postStartActivityProcessing(r, result, startedActivityStack); return result; } }
通過 3 次 startActivity()
調用,最終執行了 startActivityUnchecked()
方法,這個方法裏會根據 啓動標誌位
和 Activity 啓動模式
來決定如何啓動一個 Activity。
// frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java class ActivityStarter { private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask, ActivityRecord[] outActivity, boolean restrictedBgActivity) { // 初始化啓動 Activity 的各類配置,會先重置再從新配置,其中包括 ActivityRecord、Intent 等 setInitialState(r, options, inTask, doResume, startFlags, sourceRecord, voiceSession, voiceInteractor, restrictedBgActivity); final int preferredWindowingMode = mLaunchParams.mWindowingMode; // 計算出啓動的 FLAG,並將計算的值賦值給 mLaunchFlags computeLaunchingTaskFlags(); computeSourceStack(); // 將 mLaunchFlags 設置給 Intent,達到設定 Activity 的啓動方式的目的 mIntent.setFlags(mLaunchFlags); // 獲取是否有能夠複用的 activity ActivityRecord reusedActivity = getReusableIntentActivity(); ... ... // 可複用 Activity 不爲空 if (reusedActivity != null) { ... ... } ... ... mTargetStack.startActivityLocked(mStartActivity, topFocused, newTask, mKeepCurTransition, mOptions); if (mDoResume) { final ActivityRecord topTaskActivity = mStartActivity.getTaskRecord().topRunningActivityLocked(); if (!mTargetStack.isFocusable() || (topTaskActivity != null && topTaskActivity.mTaskOverlay && mStartActivity != topTaskActivity)) { mTargetStack.ensureActivitiesVisibleLocked(mStartActivity, 0, !PRESERVE_WINDOWS); mTargetStack.getDisplay().mDisplayContent.executeAppTransition(); } else { if (mTargetStack.isFocusable() && !mRootActivityContainer.isTopDisplayFocusedStack(mTargetStack)) { mTargetStack.moveToFront("startActivityUnchecked"); } // 調用 resumeFocusedStacksTopActivities() 方法 mRootActivityContainer.resumeFocusedStacksTopActivities( mTargetStack, mStartActivity, mOptions); } } else if (mStartActivity != null) { mSupervisor.mRecentTasks.add(mStartActivity.getTaskRecord()); } mRootActivityContainer.updateUserStack(mStartActivity.mUserId, mTargetStack); mSupervisor.handleNonResizableTaskIfNeeded(mStartActivity.getTaskRecord(), preferredWindowingMode, mPreferredDisplayId, mTargetStack); return START_SUCCESS; } }
// frameworks/base/services/core/java/com/android/server/wm/RootActivityContainer.java class RootActivityContainer extends ConfigurationContainer implements DisplayManager.DisplayListener { boolean resumeFocusedStacksTopActivities( ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) { ... ... boolean result = false; if (targetStack != null && (targetStack.isTopStackOnDisplay() || getTopDisplayFocusedStack() == targetStack)) { // 調用 resumeTopActivityUncheckedLocked() 方法 result = targetStack.resumeTopActivityUncheckedLocked(target, targetOptions); } ... ... return result; } }
// frameworks/base/services/core/java/com/android/server/wm/ActivityStack.java class ActivityStack extends ConfigurationContainer { boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) { if (mInResumeTopActivity) { // Don't even start recursing. return false; } boolean result = false; try { mInResumeTopActivity = true; // 調用 resumeTopActivityInnerLocked() 方法 result = resumeTopActivityInnerLocked(prev, options); final ActivityRecord next = topRunningActivityLocked(true /* focusableOnly */); if (next == null || !next.canTurnScreenOn()) { checkReadyForSleep(); } } finally { mInResumeTopActivity = false; } return result; } }
// frameworks/base/services/core/java/com/android/server/wm/ActivityStack.java class ActivityStack extends ConfigurationContainer { private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) { if (!mService.isBooting() && !mService.isBooted()) { // Not ready yet! return false; } ... ... boolean pausing = display.pauseBackStacks(userLeaving, next, false); if (mResumedActivity != null) { if (DEBUG_STATES) Slog.d(TAG_STATES, "resumeTopActivityLocked: Pausing " + mResumedActivity); // 先執行 startPausingLocked() 方法 pausing |= startPausingLocked(userLeaving, false, next, false); } ... ... if (next.attachedToProcess()) { ... ... try { ... ... } catch (Exception e) { // Whoops, need to restart this activity! if (DEBUG_STATES) Slog.v(TAG_STATES, "Resume failed; resetting state to " + lastState + ": " + next); next.setState(lastState, "resumeTopActivityInnerLocked"); // lastResumedActivity being non-null implies there is a lastStack present. if (lastResumedActivity != null) { lastResumedActivity.setState(RESUMED, "resumeTopActivityInnerLocked"); } Slog.i(TAG, "Restarting because process died: " + next); if (!next.hasBeenLaunched) { next.hasBeenLaunched = true; } else if (SHOW_APP_STARTING_PREVIEW && lastFocusedStack != null && lastFocusedStack.isTopStackOnDisplay()) { next.showStartingWindow(null /* prev */, false /* newTask */, false /* taskSwitch */); } // 執行 startSpecificActivityLocked() 方法 mStackSupervisor.startSpecificActivityLocked(next, true, false); return true; } try { next.completeResumeLocked(); } catch (Exception e) { // If any exception gets thrown, toss away this // activity and try the next one. Slog.w(TAG, "Exception thrown during resume of " + next, e); requestFinishActivityLocked(next.appToken, Activity.RESULT_CANCELED, null, "resume-exception", true); return true; } } else { // Whoops, need to restart this activity! if (!next.hasBeenLaunched) { next.hasBeenLaunched = true; } else { if (SHOW_APP_STARTING_PREVIEW) { next.showStartingWindow(null /* prev */, false /* newTask */, false /* taskSwich */); } if (DEBUG_SWITCH) Slog.v(TAG_SWITCH, "Restarting: " + next); } if (DEBUG_STATES) Slog.d(TAG_STATES, "resumeTopActivityLocked: Restarting " + next); // 執行 startSpecificActivityLocked() 方法 mStackSupervisor.startSpecificActivityLocked(next, true, true); } return true; } }
在 resumeTopActivityInnerLocked()
方法中會去判斷是否有 Activity 處於 Resume
狀態。
若是有的話會先讓這個 Activity 執行 Pausing
過程(其實也就是本案例中 Launcher
的 onPause
流程),而後再執行 startSpecificActivityLocked
方法來啓動須要啓動的 Activity。
咱們先分析 startPausingLocked()
源碼,應用的啓動流程 startSpecificActivityLocked()
放在第三節討論!
// frameworks/base/services/core/java/com/android/server/wm/ActivityStack.java class ActivityStack extends ConfigurationContainer { final ActivityTaskManagerService mService; // 棧頂 Activity 執行 onPause() 方法退出 final boolean startPausingLocked(boolean userLeaving, boolean uiSleeping, ActivityRecord resuming, boolean pauseImmediately) { ... ... ActivityRecord prev = mResumedActivity; ... ... // 把 prev 賦值給 mPausingActivity,這個值在 Activity 啓動過程當中會用到, // 這邊其實就是將 mResumedActivity 賦值給 mPausingActivity,就是咱們的 Launcher。 mPausingActivity = prev; mLastPausedActivity = prev; mLastNoHistoryActivity = (prev.intent.getFlags() & Intent.FLAG_ACTIVITY_NO_HISTORY) != 0 || (prev.info.flags & ActivityInfo.FLAG_NO_HISTORY) != 0 ? prev : null; prev.setState(PAUSING, "startPausingLocked"); prev.getTaskRecord().touchActiveTime(); clearLaunchTime(prev); mService.updateCpuStats(); ... ... if (prev.attachedToProcess()) { if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Enqueueing pending pause: " + prev); try { EventLogTags.writeAmPauseActivity(prev.mUserId, System.identityHashCode(prev), prev.shortComponentName, "userLeaving=" + userLeaving); /* * 從 Android P 開始,引入了 ClientLifecycleManager 和 ClientTransactionHandler 來輔助 * 管理 Activity 生命週期,它會發送 EXECUTE_TRANSACTION 消息到 ActivityThread.H 裏面繼續處理。 * 經過 ClientLifecycleManager 的 scheduleTransaction() 方法把 PauseActivityItem * 事件加入到執行計劃中,開始棧頂的 pausing 過程。 * * ClientLifecycleManager getLifecycleManager() { * return mLifecycleManager; * } */ mService.getLifecycleManager().scheduleTransaction(prev.app.getThread(), prev.appToken, PauseActivityItem.obtain(prev.finishing, userLeaving, prev.configChangeFlags, pauseImmediately)); } catch (Exception e) { // Ignore exception, if process died other code will cleanup. Slog.w(TAG, "Exception thrown during pause", e); mPausingActivity = null; mLastPausedActivity = null; mLastNoHistoryActivity = null; } } else { mPausingActivity = null; mLastPausedActivity = null; mLastNoHistoryActivity = null; } ... ... } }
// frameworks/base/services/core/java/com/android/server/wm/ClientLifecycleManager.java class ClientLifecycleManager { void scheduleTransaction(@NonNull IApplicationThread client, @NonNull IBinder activityToken, @NonNull ActivityLifecycleItem stateRequest) throws RemoteException { final ClientTransaction clientTransaction = transactionWithState(client, activityToken, stateRequest); scheduleTransaction(clientTransaction); } void scheduleTransaction(ClientTransaction transaction) throws RemoteException { final IApplicationThread client = transaction.getClient(); transaction.schedule(); if (!(client instanceof Binder)) { transaction.recycle(); } } } // frameworks/base/core/java/android/app/servertransaction/ClientTransaction.java public class ClientTransaction implements Parcelable, ObjectPoolItem { /** Target client. */ private IApplicationThread mClient; public IApplicationThread getClient() { return mClient; } public void schedule() throws RemoteException { mClient.scheduleTransaction(this); } }
ClientTransaction.schedule()
方法的 mClient
是一個 IApplicationThread
類型,ActivityThread 的內部類 ApplicationThread
派生這個接口類並實現了對應的方法。因此直接跳轉到 ApplicationThread
中的 scheduleTransaction()
方法。
// frameworks/base/core/java/android/app/ActivityThread.java public final class ActivityThread extends ClientTransactionHandler { private class ApplicationThread extends IApplicationThread.Stub { public void scheduleTransaction(ClientTransaction transaction) throws RemoteException { ActivityThread.this.scheduleTransaction(transaction); } } }
ActivityThread 類中並無定義 scheduleTransaction()
方法,因此調用的是他父類 ClientTransactionHandler
的 scheduleTransaction()
方法。
// frameworks/base/core/java/android/app/ClientTransactionHandler.java public abstract class ClientTransactionHandler { abstract void sendMessage(int what, Object obj); /** Prepare and schedule transaction for execution. */ void scheduleTransaction(ClientTransaction transaction) { transaction.preExecute(this); // 調用了 sendMessage 方法,這個方法是一個抽象方法, // 它的實現是在 ClientTransactionHandler 派生類的 ActivityThread 中。 sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction); } }
// frameworks/base/core/java/android/app/ActivityThread.java public final class ActivityThread extends ClientTransactionHandler { // An executor that performs multi-step transactions. private final TransactionExecutor mTransactionExecutor = new TransactionExecutor(this); class H extends Handler { public void handleMessage(Message msg) { if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what)); switch (msg.what) { case EXECUTE_TRANSACTION: final ClientTransaction transaction = (ClientTransaction) msg.obj; // Handler H 的實例接收到 EXECUTE_TRANSACTION 消息後調用 // TransactionExecutor.execute() 方法切換 Activity 狀態。 mTransactionExecutor.execute(transaction); if (isSystem()) { transaction.recycle(); } // TODO(lifecycler): Recycle locally scheduled transactions. break; } } } void sendMessage(int what, Object obj) { sendMessage(what, obj, 0, 0, false); } private void sendMessage(int what, Object obj, int arg1) { sendMessage(what, obj, arg1, 0, false); } private void sendMessage(int what, Object obj, int arg1, int arg2) { sendMessage(what, obj, arg1, arg2, false); } private void sendMessage(int what, Object obj, int arg1, int arg2, boolean async) { Message msg = Message.obtain(); msg.what = what; msg.obj = obj; msg.arg1 = arg1; msg.arg2 = arg2; if (async) { msg.setAsynchronous(true); } // ActivityThread.sendMessage() 方法會把消息發送給內部名字叫 H 的 Handler mH.sendMessage(msg); } }
// frameworks/base/core/java/android/app/servertransaction/TransactionExecutor.java public class TransactionExecutor { public void execute(ClientTransaction transaction) { if (DEBUG_RESOLVER) Slog.d(TAG, tId(transaction) + "Start resolving transaction"); final IBinder token = transaction.getActivityToken(); ... ... executeCallbacks(transaction); // 重要方法 1 executeLifecycleState(transaction); // 重要方法 2 mPendingActions.clear(); if (DEBUG_RESOLVER) Slog.d(TAG, tId(transaction) + "End resolving transaction"); } // 重要方法 1 /** Cycle through all states requested by callbacks and execute them at proper times. */ public void executeCallbacks(ClientTransaction transaction) { final List<ClientTransactionItem> callbacks = transaction.getCallbacks(); ... ... final int size = callbacks.size(); for (int i = 0; i < size; ++i) { final ClientTransactionItem item = callbacks.get(i); ... ... item.execute(mTransactionHandler, token, mPendingActions); item.postExecute(mTransactionHandler, token, mPendingActions); ... ... } } // 重要方法 2 /** Transition to the final state if requested by the transaction. */ private void executeLifecycleState(ClientTransaction transaction) { final ActivityLifecycleItem lifecycleItem = transaction.getLifecycleStateRequest(); ... ... // 執行當前生命週期狀態以前的狀態 cycleToPath(r, lifecycleItem.getTargetState(), true /* excludeLastState */, transaction); // Execute the final transition with proper parameters. lifecycleItem.execute(mTransactionHandler, token, mPendingActions); lifecycleItem.postExecute(mTransactionHandler, token, mPendingActions); } }
前面講解到:在 ActivityStack.startPausingLocked()
方法裏面 scheduleTransaction()
傳遞的是 PauseActivityItem()
對象,因此 executeLifecycleState()
方法裏調用的 lifecycleItem.execute()
方法其實就是 PauseActivityItem.execute()
方法。
// frameworks/base/core/java/android/app/servertransaction/PauseActivityItem.java /** * Request to move an activity to paused state. * @hide */ public class PauseActivityItem extends ActivityLifecycleItem { @Override public void execute(ClientTransactionHandler client, IBinder token, PendingTransactionActions pendingActions) { Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityPause"); // 跳轉到 ActivityThread.handlePauseActivity 方法 client.handlePauseActivity(token, mFinished, mUserLeaving, mConfigChanges, pendingActions, "PAUSE_ACTIVITY_ITEM"); Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER); } }
// frameworks/base/core/java/android/app/ActivityThread.java public final class ActivityThread extends ClientTransactionHandler { @Override public void handlePauseActivity(IBinder token, boolean finished, boolean userLeaving, int configChanges, PendingTransactionActions pendingActions, String reason) { ActivityClientRecord r = mActivities.get(token); if (r != null) { if (userLeaving) { performUserLeavingActivity(r); } r.activity.mConfigChangeFlags |= configChanges; // 調用 performPauseActivity() 方法 performPauseActivity(r, finished, reason, pendingActions); // Make sure any pending writes are now committed. if (r.isPreHoneycomb()) { QueuedWork.waitToFinish(); } mSomeActivitiesChanged = true; } } }
// frameworks/base/core/java/android/app/ActivityThread.java public final class ActivityThread extends ClientTransactionHandler { /** * Pause the activity. * @return Saved instance state for pre-Honeycomb apps if it was saved, {@code null} otherwise. */ private Bundle performPauseActivity(ActivityClientRecord r, boolean finished, String reason, PendingTransactionActions pendingActions) { ... ... performPauseActivityIfNeeded(r, reason); ... ... } }
// frameworks/base/core/java/android/app/ActivityThread.java public final class ActivityThread extends ClientTransactionHandler { private void performPauseActivityIfNeeded(ActivityClientRecord r, String reason) { if (r.paused) { // You are already paused silly... return; } reportTopResumedActivityChanged(r, false /* onTop */, "pausing"); try { r.activity.mCalled = false; mInstrumentation.callActivityOnPause(r.activity); // 關鍵方法 if (!r.activity.mCalled) { throw new SuperNotCalledException("Activity " + safeToComponentShortString(r.intent) + " did not call through to super.onPause()"); } } catch (SuperNotCalledException e) { throw e; } catch (Exception e) { if (!mInstrumentation.onException(r.activity, e)) { throw new RuntimeException("Unable to pause activity " + safeToComponentShortString(r.intent) + ": " + e.toString(), e); } } r.setState(ON_PAUSE); } }
// frameworks/base/core/java/android/app/Instrumentation.java public class Instrumentation { /** * Perform calling of an activity's {@link Activity#onPause} method. The * default implementation simply calls through to that method. * * @param activity The activity being paused. */ public void callActivityOnPause(Activity activity) { activity.performPause(); // 直接調用 Activity.performPause 方法 } }
// frameworks/base/core/java/android/app/Activity.java public class Activity extends ContextThemeWrapper implements LayoutInflater.Factory2, Window.Callback, KeyEvent.Callback, OnCreateContextMenuListener, ComponentCallbacks2, Window.OnWindowDismissedCallback, WindowControllerCallback, AutofillManager.AutofillClient, ContentCaptureManager.ContentCaptureClient { final void performPause() { dispatchActivityPrePaused(); mDoReportFullyDrawn = false; mFragments.dispatchPause(); mCalled = false; onPause(); // 執行暫停方法 writeEventLog(LOG_AM_ON_PAUSE_CALLED, "performPause"); mResumed = false; if (!mCalled && getApplicationInfo().targetSdkVersion >= android.os.Build.VERSION_CODES.GINGERBREAD) { throw new SuperNotCalledException( "Activity " + mComponent.toShortString() + " did not call through to super.onPause()"); } dispatchActivityPostPaused(); } }
至此,Launcher 的 onPause() 流程分析結束!同時,咱們須要明白一點:在啓動一個 Activity 的時候最早被執行的是棧頂的 Activity 的 onPause() 方法。
Launcher 的 onPause()
流程分析完,接下來咱們看看新進程的啓動流程:startSpecificActivityLocked()
方法。在這個方法中會去根據 進程
和 線程
是否存在判斷 App 是否已經啓動。
// frameworks/base/services/core/java/com/android/server/wm/ActivityStackSupervisor.java public class ActivityStackSupervisor implements RecentTasks.Callbacks { final ActivityTaskManagerService mService; void startSpecificActivityLocked(ActivityRecord r, boolean andResume, boolean checkConfig) { // Is this activity's application already running? final WindowProcessController wpc = mService.getProcessController(r.processName, r.info.applicationInfo.uid); boolean knownToBeDead = false; // 若是 app 存在,而且已經啓動 if (wpc != null && wpc.hasThread()) { try { // app 存在而且已經啓動,調用 realStartActivityLocked() 方法 realStartActivityLocked(r, wpc, andResume, checkConfig); return; } catch (RemoteException e) { Slog.w(TAG, "Exception when starting activity " + r.intent.getComponent().flattenToShortString(), e); } // If a dead object exception was thrown -- fall through to // restart the application. knownToBeDead = true; } if (getKeyguardController().isKeyguardLocked()) { r.notifyUnknownVisibilityLaunched(); } final boolean isTop = andResume && r.isTopRunningActivity(); // 調用 startProcessAsync() 方法啓動新的進程 mService.startProcessAsync(r, knownToBeDead, isTop, isTop ? "top-activity" : "activity"); } }
若是已經啓動,就會調用 ActivityTaskManagerService.realStartActivityLocked()
方法繼續處理。
若是沒有啓動,則會調用 ActivityTaskManagerService.startProcessAsync()
方法建立新的進程,咱們重點看下新應用進程的建立流程。
// frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java public class ActivityTaskManagerService extends IActivityTaskManager.Stub { void startProcessAsync(ActivityRecord activity, boolean knownToBeDead, boolean isTop, String hostingType) { try { if (Trace.isTagEnabled(TRACE_TAG_ACTIVITY_MANAGER)) { Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "dispatchingStartProcess:" + activity.processName); } // Post message to start process to avoid possible deadlock of calling into AMS with the // ATMS lock held. // Message 包含一個 ActivityManagerInternal::startProcess 方法 final Message m = PooledLambda.obtainMessage(ActivityManagerInternal::startProcess, mAmInternal, activity.processName, activity.info.applicationInfo, knownToBeDead, isTop, hostingType, activity.intent.getComponent()); mH.sendMessage(m); } finally { Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER); } } }
// frameworks/base/core/java/android/app/ActivityManagerInternal.java public abstract class ActivityManagerInternal { // 抽象方法,由 ActivityManagerService 內部類 LocalService 實現 public abstract void startProcess(String processName, ApplicationInfo info, boolean knownToBeDead, boolean isTop, String hostingType, ComponentName hostingName); }
// frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java public class ActivityManagerService extends IActivityManager.Stub implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback { @VisibleForTesting public final class LocalService extends ActivityManagerInternal { @Override public void startProcess(String processName, ApplicationInfo info, boolean knownToBeDead, boolean isTop, String hostingType, ComponentName hostingName) { try { if (Trace.isTagEnabled(Trace.TRACE_TAG_ACTIVITY_MANAGER)) { Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "startProcess:" + processName); } synchronized (ActivityManagerService.this) { // 調用 startProcessLocked() 方法 startProcessLocked(processName, info, knownToBeDead, 0 /* intentFlags */, new HostingRecord(hostingType, hostingName, isTop), ZYGOTE_POLICY_FLAG_LATENCY_SENSITIVE, false /* allowWhileBooting */, false /* isolated */, true /* keepIfLarge */); } } finally { Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); } } } }
// frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java public class ActivityManagerService extends IActivityManager.Stub implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback { /** * Process management. */ final ProcessList mProcessList = new ProcessList(); @GuardedBy("this") final ProcessRecord startProcessLocked(String processName, ApplicationInfo info, boolean knownToBeDead, int intentFlags, HostingRecord hostingRecord, int zygotePolicyFlags, boolean allowWhileBooting, boolean isolated, boolean keepIfLarge) { return mProcessList.startProcessLocked(processName, info, knownToBeDead, intentFlags, hostingRecord, zygotePolicyFlags, allowWhileBooting, isolated, 0 /* isolatedUid */, keepIfLarge, null /* ABI override */, null /* entryPoint */, null /* entryPointArgs */, null /* crashHandler */); } }
// frameworks/base/services/core/java/com/android/server/am/ProcessList.java /** * Activity manager code dealing with processes. */ public final class ProcessList { @GuardedBy("mService") final ProcessRecord startProcessLocked(String processName, ApplicationInfo info, boolean knownToBeDead, int intentFlags, HostingRecord hostingRecord, int zygotePolicyFlags, boolean allowWhileBooting, boolean isolated, int isolatedUid, boolean keepIfLarge, String abiOverride, String entryPoint, String[] entryPointArgs, Runnable crashHandler) { // 調用 startProcessLocked() 方法 final boolean success = startProcessLocked(app, hostingRecord, zygotePolicyFlags, abiOverride); } }
// frameworks/base/services/core/java/com/android/server/am/ProcessList.java /** * Activity manager code dealing with processes. */ public final class ProcessList { @GuardedBy("mService") final boolean startProcessLocked(ProcessRecord app, HostingRecord hostingRecord, int zygotePolicyFlags, String abiOverride) { // 調用 startProcessLocked() 方法 return startProcessLocked(app, hostingRecord, zygotePolicyFlags, false /* disableHiddenApiChecks */, false /* disableTestApiChecks */, false /* mountExtStorageFull */, abiOverride); } }
// frameworks/base/services/core/java/com/android/server/am/ProcessList.java /** * Activity manager code dealing with processes. */ public final class ProcessList { @GuardedBy("mService") boolean startProcessLocked(ProcessRecord app, HostingRecord hostingRecord, int zygotePolicyFlags, boolean disableHiddenApiChecks, boolean disableTestApiChecks, boolean mountExtStorageFull, String abiOverride) { ... ... try { ... ... // 調用 startProcessLocked() 方法 return startProcessLocked(hostingRecord, entryPoint, app, uid, gids, runtimeFlags, zygotePolicyFlags, mountExternal, seInfo, requiredAbi, instructionSet, invokeWith, startTime); } catch (RuntimeException e) { Slog.e(ActivityManagerService.TAG, "Failure starting process " + app.processName, e); mService.forceStopPackageLocked(app.info.packageName, UserHandle.getAppId(app.uid), false, false, true, false, false, app.userId, "start failure"); return false; } } }
// frameworks/base/services/core/java/com/android/server/am/ProcessList.java /** * Activity manager code dealing with processes. */ public final class ProcessList { @GuardedBy("mService") boolean startProcessLocked(HostingRecord hostingRecord, String entryPoint, ProcessRecord app, int uid, int[] gids, int runtimeFlags, int zygotePolicyFlags, int mountExternal, String seInfo, String requiredAbi, String instructionSet, String invokeWith, long startTime) { if (mService.mConstants.FLAG_PROCESS_START_ASYNC) { if (DEBUG_PROCESSES) Slog.i(TAG_PROCESSES, "Posting procStart msg for " + app.toShortString()); mService.mProcStartHandler.post(() -> { ... ... }); return true; } else { try { // 調用 startProcess() 方法 final Process.ProcessStartResult startResult = startProcess(hostingRecord, entryPoint, app, uid, gids, runtimeFlags, zygotePolicyFlags, mountExternal, seInfo, requiredAbi, instructionSet, invokeWith, startTime); handleProcessStartedLocked(app, startResult.pid, startResult.usingWrapper, startSeq, false); } catch (RuntimeException e) { Slog.e(ActivityManagerService.TAG, "Failure starting process " + app.processName, e); app.pendingStart = false; mService.forceStopPackageLocked(app.info.packageName, UserHandle.getAppId(app.uid), false, false, true, false, false, app.userId, "start failure"); } return app.pid > 0; } } }
// frameworks/base/services/core/java/com/android/server/am/ProcessList.java /** * Activity manager code dealing with processes. */ public final class ProcessList { private Process.ProcessStartResult startProcess(HostingRecord hostingRecord, String entryPoint, ProcessRecord app, int uid, int[] gids, int runtimeFlags, int zygotePolicyFlags, int mountExternal, String seInfo, String requiredAbi, String instructionSet, String invokeWith, long startTime) { try { Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "Start proc: " + app.processName); checkSlow(startTime, "startProcess: asking zygote to start proc"); final boolean isTopApp = hostingRecord.isTopApp(); if (isTopApp) { app.setHasForegroundActivities(true); } final Process.ProcessStartResult startResult; if (hostingRecord.usesWebviewZygote()) { startResult = startWebView(entryPoint, app.processName, uid, uid, gids, runtimeFlags, mountExternal, app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet, app.info.dataDir, null, app.info.packageName, app.mDisabledCompatChanges, new String[]{PROC_START_SEQ_IDENT + app.startSeq}); } else if (hostingRecord.usesAppZygote()) { final AppZygote appZygote = createAppZygoteForProcessIfNeeded(app); startResult = appZygote.getProcess().start(entryPoint, app.processName, uid, uid, gids, runtimeFlags, mountExternal, app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet, app.info.dataDir, null, app.info.packageName, /*zygotePolicyFlags=*/ ZYGOTE_POLICY_FLAG_EMPTY, isTopApp, app.mDisabledCompatChanges, new String[]{PROC_START_SEQ_IDENT + app.startSeq}); } else { // 執行 Process.start() 方法 startResult = Process.start(entryPoint, app.processName, uid, uid, gids, runtimeFlags, mountExternal, app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet, app.info.dataDir, invokeWith, app.info.packageName, zygotePolicyFlags, isTopApp, app.mDisabledCompatChanges, new String[]{PROC_START_SEQ_IDENT + app.startSeq}); } checkSlow(startTime, "startProcess: returned from zygote!"); return startResult; } finally { Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); } } }
到這裏,咱們就明白了:ActivityTaskManagerService.startProcessLocked()
方法通過屢次跳轉最終會經過 Process.start()
方法來爲應用建立進程。
進程的建立流程和源碼分析,這邊就再也不討論了!在《 【 Android 10 進程線程 】系列 -- 關於 "進程" -> "建立" 的原理】》一文中,我做了詳細的分析!
咱們在進程建立的文章中討論過:源碼最後會執行到 ActivityThread.main()
方法,執行主線程的初始化工做。
// frameworks/base/core/java/android/app/ActivityThread.java public final class ActivityThread extends ClientTransactionHandler { public static void main(String[] args) { Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain"); // Install selective syscall interception AndroidOs.install(); CloseGuard.setEnabled(false); Environment.initForCurrentUser(); // Make sure TrustedCertificateStore looks in the right place for CA certificates final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId()); TrustedCertificateStore.setDefaultUserDirectory(configDir); Process.setArgV0("<pre-initialized>"); // 建立主線程 looper Looper.prepareMainLooper(); // Find the value for {@link #PROC_START_SEQ_IDENT} if provided on the command line. // It will be in the format "seq=114" long startSeq = 0; if (args != null) { for (int i = args.length - 1; i >= 0; --i) { if (args[i] != null && args[i].startsWith(PROC_START_SEQ_IDENT)) { startSeq = Long.parseLong( args[i].substring(PROC_START_SEQ_IDENT.length())); } } } // 初始化 ActivityThread ActivityThread thread = new ActivityThread(); // attach 到系統進程 thread.attach(false, startSeq); if (sMainThreadHandler == null) { sMainThreadHandler = thread.getHandler(); } if (false) { Looper.myLooper().setMessageLogging(new LogPrinter(Log.DEBUG, "ActivityThread")); } // End of event ActivityThreadMain. Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); // 主線程啓動,進入循環狀態 Looper.loop(); throw new RuntimeException("Main thread loop unexpectedly exited"); } }
// frameworks/base/core/java/android/app/ActivityThread.java public final class ActivityThread extends ClientTransactionHandler { private void attach(boolean system, long startSeq) { sCurrentActivityThread = this; mSystemThread = system; if (!system) { ... ... final IActivityManager mgr = ActivityManager.getService(); try { // 經過 ActivityManagerService 爲這個應用綁定一個 Application mgr.attachApplication(mAppThread, startSeq); } catch (RemoteException ex) { throw ex.rethrowFromSystemServer(); } // 添加一個垃圾回收觀察者,每當系統觸發垃圾回收的時候就會在 run 方法裏面 // 去計算應用使用了多少內存,若是超過總量的四分之三就會嘗試釋放內存 BinderInternal.addGcWatcher(new Runnable() { @Override public void run() { if (!mSomeActivitiesChanged) { return; } Runtime runtime = Runtime.getRuntime(); long dalvikMax = runtime.maxMemory(); long dalvikUsed = runtime.totalMemory() - runtime.freeMemory(); if (dalvikUsed > ((3*dalvikMax)/4)) { if (DEBUG_MEMORY_TRIM) Slog.d(TAG, "Dalvik max=" + (dalvikMax/1024) + " total=" + (runtime.totalMemory()/1024) + " used=" + (dalvikUsed/1024)); mSomeActivitiesChanged = false; try { ActivityTaskManager.getService().releaseSomeActivities(mAppThread); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } } }); } else { ... ... } ... ... // 爲根 View 添加 config 回調接收 config 變化相關的信息 ViewRootImpl.addConfigCallback(configChangedCallback); } }
// frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java public class ActivityManagerService extends IActivityManager.Stub implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback { @Override public final void attachApplication(IApplicationThread thread, long startSeq) { if (thread == null) { throw new SecurityException("Invalid application interface"); } synchronized (this) { int callingPid = Binder.getCallingPid(); final int callingUid = Binder.getCallingUid(); final long origId = Binder.clearCallingIdentity(); // 調用 attachApplicationLocked() 方法 attachApplicationLocked(thread, callingPid, callingUid, startSeq); Binder.restoreCallingIdentity(origId); } } }
// frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java public class ActivityManagerService extends IActivityManager.Stub implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback { public ActivityTaskManagerInternal mAtmInternal; private boolean attachApplicationLocked(@NonNull IApplicationThread thread, int pid, int callingUid, long startSeq) { ... ... // See if the top visible activity is waiting to run in this process... if (normalMode) { try { // 調用 attachApplication() 方法 didSomething = mAtmInternal.attachApplication(app.getWindowProcessController()); } catch (Exception e) { Slog.wtf(TAG, "Exception thrown launching activities in " + app, e); badApp = true; } } return true; } }
// frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java public abstract class ActivityTaskManagerInternal { // 抽象方法,由 ActivityTaskManagerService 內部類 LocalService 實現 public abstract boolean attachApplication(WindowProcessController wpc) throws RemoteException; }
// frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java public class ActivityTaskManagerService extends IActivityTaskManager.Stub { final class LocalService extends ActivityTaskManagerInternal { @Override public boolean attachApplication(WindowProcessController wpc) throws RemoteException { synchronized (mGlobalLockWithoutBoost) { // 調用 RootActivityContainer.attachApplication() 方法 return mRootActivityContainer.attachApplication(wpc); } } } }
// frameworks/base/services/core/java/com/android/server/wm/RootActivityContainer.java class RootActivityContainer extends ConfigurationContainer implements DisplayManager.DisplayListener { boolean attachApplication(WindowProcessController app) throws RemoteException { final String processName = app.mName; boolean didSomething = false; for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { final ActivityDisplay display = mActivityDisplays.get(displayNdx); final ActivityStack stack = display.getFocusedStack(); if (stack != null) { stack.getAllRunningVisibleActivitiesLocked(mTmpActivityList); final ActivityRecord top = stack.topRunningActivityLocked(); final int size = mTmpActivityList.size(); for (int i = 0; i < size; i++) { final ActivityRecord activity = mTmpActivityList.get(i); if (activity.app == null && app.mUid == activity.info.applicationInfo.uid && processName.equals(activity.processName)) { try { // 調用 ActivityStackSupervisor.realStartActivityLocked() 方法 if (mStackSupervisor.realStartActivityLocked(activity, app, top == activity /* andResume */, true /* checkConfig */)) { didSomething = true; } } catch (RemoteException e) { Slog.w(TAG, "Exception in new application when starting activity " + top.intent.getComponent().flattenToShortString(), e); throw e; } } } } } if (!didSomething) { ensureActivitiesVisible(null, 0, false /* preserve_windows */); } return didSomething; } }
realStartActivityLocked
就是應用進程已經啓動的狀況下去啓動 Activity
所調用的方法。
// frameworks/base/services/core/java/com/android/server/wm/ActivityStackSupervisor.java public class ActivityStackSupervisor implements RecentTasks.Callbacks { boolean realStartActivityLocked(ActivityRecord r, WindowProcessController proc, boolean andResume, boolean checkConfig) throws RemoteException { ... ... final TaskRecord task = r.getTaskRecord(); final ActivityStack stack = task.getStack(); beginDeferResume(); try { try { ... ... // Create activity launch transaction. final ClientTransaction clientTransaction = ClientTransaction.obtain( proc.getThread(), r.appToken); final DisplayContent dc = r.getDisplay().mDisplayContent; // 爲 ClientTransaction 對象添加 LaunchActivityItem 的 callback clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent), System.identityHashCode(r), r.info, // TODO: Have this take the merged configuration instead of separate global // and override configs. mergedConfiguration.getGlobalConfiguration(), mergedConfiguration.getOverrideConfiguration(), r.compat, r.launchedFromPackage, task.voiceInteractor, proc.getReportedProcState(), r.icicle, r.persistentState, results, newIntents, dc.isNextTransitionForward(), proc.createProfilerInfoIfNeeded(), r.assistToken)); // Set desired final state. final ActivityLifecycleItem lifecycleItem; // 設置當前的生命週期狀態 if (andResume) { lifecycleItem = ResumeActivityItem.obtain(dc.isNextTransitionForward()); } else { lifecycleItem = PauseActivityItem.obtain(); } clientTransaction.setLifecycleStateRequest(lifecycleItem); // 調用 ClientLifecycleManager.scheduleTransaction 方法 mService.getLifecycleManager().scheduleTransaction(clientTransaction); ... ... } catch (RemoteException e) { } } finally { endDeferResume(); } ... ... return true; } }
調用 ClientLifecycleManager.scheduleTransaction()
方法以後具體是如何執行的前面已經分析過了,這裏就再也不分析了。咱們這裏跟蹤執行 callback
後跳轉到 LaunchActivityItem.execute()
方法。
// frameworks/base/core/java/android/app/servertransaction/LaunchActivityItem.java /** * Request to launch an activity. * @hide */ public class LaunchActivityItem extends ClientTransactionItem { @Override public void execute(ClientTransactionHandler client, IBinder token, PendingTransactionActions pendingActions) { Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityStart"); ActivityClientRecord r = new ActivityClientRecord(token, mIntent, mIdent, mInfo, mOverrideConfig, mCompatInfo, mReferrer, mVoiceInteractor, mState, mPersistentState, mPendingResults, mPendingNewIntents, mIsForward, mProfilerInfo, client, mAssistToken); // 調用 ActivityThread.handleLaunchActivity() 方法 client.handleLaunchActivity(r, pendingActions, null /* customIntent */); Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER); } }
// frameworks/base/core/java/android/app/ActivityThread.java public final class ActivityThread extends ClientTransactionHandler { @Override public Activity handleLaunchActivity(ActivityClientRecord r, PendingTransactionActions pendingActions, Intent customIntent) { // 調用 performLaunchActivity() 方法 final Activity a = performLaunchActivity(r, customIntent); } }
// frameworks/base/core/java/android/app/ActivityThread.java public final class ActivityThread extends ClientTransactionHandler { /** Core implementation of activity launch. */ private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) { ActivityInfo aInfo = r.activityInfo; if (r.packageInfo == null) { r.packageInfo = getPackageInfo(aInfo.applicationInfo, r.compatInfo, Context.CONTEXT_INCLUDE_CODE); } // 初始化 ComponentName ComponentName component = r.intent.getComponent(); if (component == null) { component = r.intent.resolveActivity( mInitialApplication.getPackageManager()); r.intent.setComponent(component); } if (r.activityInfo.targetActivity != null) { component = new ComponentName(r.activityInfo.packageName, r.activityInfo.targetActivity); } // 初始化 ContextImpl 和 Activity ContextImpl appContext = createBaseContextForActivity(r); Activity activity = null; try { ... ... } catch (Exception e) { } try { // 初始化 Application Application app = r.packageInfo.makeApplication(false, mInstrumentation); if (activity != null) { CharSequence title = r.activityInfo.loadLabel(appContext.getPackageManager()); ... ... r.lastNonConfigurationInstances = null; checkAndBlockForNetworkAccess(); activity.mStartedActivity = false; // 設置 Activity 的 Theme int theme = r.activityInfo.getThemeResource(); if (theme != 0) { activity.setTheme(theme); } activity.mCalled = false; if (r.isPersistable()) { // 調用 Instrumentation.callActivityOnCreate() 方法 mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState); } else { mInstrumentation.callActivityOnCreate(activity, r.state); } if (!activity.mCalled) { throw new SuperNotCalledException( "Activity " + r.intent.getComponent().toShortString() + " did not call through to super.onCreate()"); } r.activity = activity; } r.setState(ON_CREATE); synchronized (mResourcesManager) { mActivities.put(r.token, r); } } catch (SuperNotCalledException e) { ... ... } return activity; } }
// frameworks/base/core/java/android/app/Instrumentation.java public class Instrumentation { public void callActivityOnCreate(Activity activity, Bundle icicle) { prePerformCreate(activity); // 調用 performCreate() 方法 activity.performCreate(icicle); postPerformCreate(activity); } }
// frameworks/base/core/java/android/app/Activity.java public class Activity extends ContextThemeWrapper implements LayoutInflater.Factory2, Window.Callback, KeyEvent.Callback, OnCreateContextMenuListener, ComponentCallbacks2, Window.OnWindowDismissedCallback, WindowControllerCallback, AutofillManager.AutofillClient, ContentCaptureManager.ContentCaptureClient { final void performCreate(Bundle icicle) { performCreate(icicle, null); } }
至此 executeCallbacks()
執行完畢,開始執行 executeLifecycleState()
方法,會先執行 cycleToPath()
方法(這邊若是以爲亂的話,能夠回去看下以前的分析)。
// frameworks/base/core/java/android/app/servertransaction/TransactionExecutor.java public class TransactionExecutor { private void cycleToPath(ActivityClientRecord r, int finish, boolean excludeLastState, ClientTransaction transaction) { final int start = r.getLifecycleState(); if (DEBUG_RESOLVER) { Slog.d(TAG, tId(transaction) + "Cycle activity: " + getShortActivityName(r.token, mTransactionHandler) + " from: " + getStateName(start) + " to: " + getStateName(finish) + " excludeLastState: " + excludeLastState); } final IntArray path = mHelper.getLifecyclePath(start, finish, excludeLastState); // 調用 performLifecycleSequence() 方法 performLifecycleSequence(r, path, transaction); } }
// frameworks/base/core/java/android/app/servertransaction/TransactionExecutor.java public class TransactionExecutor { private ClientTransactionHandler mTransactionHandler; /** Transition the client through previously initialized state sequence. */ private void performLifecycleSequence(ActivityClientRecord r, IntArray path, ClientTransaction transaction) { final int size = path.size(); for (int i = 0, state; i < size; i++) { state = path.get(i); if (DEBUG_RESOLVER) { Slog.d(TAG, tId(transaction) + "Transitioning activity: " + getShortActivityName(r.token, mTransactionHandler) + " to state: " + getStateName(state)); } // 生命週期狀態是從 ON_CREATE 狀態到 ON_RESUME 狀態,中間有一個 ON_START 狀態, // 因此會執行 ActivityThread.handleStartActivity() 方法。 switch (state) { case ON_CREATE: mTransactionHandler.handleLaunchActivity(r, mPendingActions, null /* customIntent */); break; case ON_START: mTransactionHandler.handleStartActivity(r, mPendingActions); break; case ON_RESUME: mTransactionHandler.handleResumeActivity(r.token, false /* finalStateRequest */, r.isForward, "LIFECYCLER_RESUME_ACTIVITY"); break; case ON_PAUSE: mTransactionHandler.handlePauseActivity(r.token, false /* finished */, false /* userLeaving */, 0 /* configChanges */, mPendingActions, "LIFECYCLER_PAUSE_ACTIVITY"); break; case ON_STOP: mTransactionHandler.handleStopActivity(r.token, false /* show */, 0 /* configChanges */, mPendingActions, false /* finalStateRequest */, "LIFECYCLER_STOP_ACTIVITY"); break; case ON_DESTROY: mTransactionHandler.handleDestroyActivity(r.token, false /* finishing */, 0 /* configChanges */, false /* getNonConfigInstance */, "performLifecycleSequence. cycling to:" + path.get(size - 1)); break; case ON_RESTART: mTransactionHandler.performRestartActivity(r.token, false /* start */); break; default: throw new IllegalArgumentException("Unexpected lifecycle state: " + state); } } } }
// frameworks/base/core/java/android/app/ActivityThread.java public final class ActivityThread extends ClientTransactionHandler { @Override public void handleStartActivity(ActivityClientRecord r, PendingTransactionActions pendingActions) { final Activity activity = r.activity; ... ... // Start activity.performStart("handleStartActivity"); r.setState(ON_START); ... ... } }
// frameworks/base/core/java/android/app/Activity.java public class Activity extends ContextThemeWrapper implements LayoutInflater.Factory2, Window.Callback, KeyEvent.Callback, OnCreateContextMenuListener, ComponentCallbacks2, Window.OnWindowDismissedCallback, WindowControllerCallback, AutofillManager.AutofillClient, ContentCaptureManager.ContentCaptureClient { final void performStart(String reason) { ... ... mInstrumentation.callActivityOnStart(this); ... ... } }
// frameworks/base/core/java/android/app/Instrumentation.java public class Instrumentation { public void callActivityOnStart(Activity activity) { // 最終調用了 Activity.onStart() 方法 activity.onStart(); } }
執行完畢 cycleToPath
,開始執行 ResumeActivityItem.execute()
方法。
// frameworks/base/core/java/android/app/servertransaction/ResumeActivityItem.java /** * Request to move an activity to resumed state. * @hide */ public class ResumeActivityItem extends ActivityLifecycleItem { @Override public void execute(ClientTransactionHandler client, IBinder token, PendingTransactionActions pendingActions) { Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityResume"); // 調用 ActivityThread.handleResumeActivity() 方法 client.handleResumeActivity(token, true /* finalStateRequest */, mIsForward, "RESUME_ACTIVITY"); Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER); } }
// frameworks/base/core/java/android/app/ActivityThread.java public final class ActivityThread extends ClientTransactionHandler { @Override public void handleResumeActivity(IBinder token, boolean finalStateRequest, boolean isForward, String reason) { // TODO Push resumeArgs into the activity for consideration final ActivityClientRecord r = performResumeActivity(token, finalStateRequest, reason); if (r == null) { // We didn't actually resume the activity, so skipping any follow-up actions. return; } ... ... // 這邊的方法咱們在最後會說明,其中涉及到 onStop() 方法 Looper.myQueue().addIdleHandler(new Idler()); } }
// frameworks/base/core/java/android/app/ActivityThread.java public final class ActivityThread extends ClientTransactionHandler { public ActivityClientRecord performResumeActivity(IBinder token, boolean finalStateRequest, String reason) { ... ... try { r.activity.onStateNotSaved(); r.activity.mFragments.noteStateNotSaved(); checkAndBlockForNetworkAccess(); if (r.pendingIntents != null) { deliverNewIntents(r, r.pendingIntents); r.pendingIntents = null; } if (r.pendingResults != null) { deliverResults(r, r.pendingResults, reason); r.pendingResults = null; } // 調用 performResume() 方法 r.activity.performResume(r.startsNotResumed, reason); r.state = null; r.persistentState = null; r.setState(ON_RESUME); reportTopResumedActivityChanged(r, r.isTopResumedActivity, "topWhenResuming"); } catch (Exception e) { if (!mInstrumentation.onException(r.activity, e)) { throw new RuntimeException("Unable to resume activity " + r.intent.getComponent().toShortString() + ": " + e.toString(), e); } } return r; } }
// frameworks/base/core/java/android/app/Activity.java public class Activity extends ContextThemeWrapper implements LayoutInflater.Factory2, Window.Callback, KeyEvent.Callback, OnCreateContextMenuListener, ComponentCallbacks2, Window.OnWindowDismissedCallback, WindowControllerCallback, AutofillManager.AutofillClient, ContentCaptureManager.ContentCaptureClient { final void performResume(boolean followedByPause, String reason) { dispatchActivityPreResumed(); performRestart(true /* start */, reason); ... ... mInstrumentation.callActivityOnResume(this); ... ... dispatchActivityPostResumed(); } }
// frameworks/base/core/java/android/app/Instrumentation.java public class Instrumentation { public void callActivityOnResume(Activity activity) { activity.mResumed = true; // 調用了 Activity.onResume() 方法 activity.onResume(); if (mActivityMonitors != null) { synchronized (mSync) { final int N = mActivityMonitors.size(); for (int i=0; i<N; i++) { final ActivityMonitor am = mActivityMonitors.get(i); am.match(activity, activity, activity.getIntent()); } } } } }
至此,Activity
啓動完畢。
咱們在討論 ActivityThread.handleResumeActivity()
源碼的時候,最後一行代碼比較特殊,還未進行討論。
// frameworks/base/core/java/android/app/ActivityThread.java public final class ActivityThread extends ClientTransactionHandler { @Override public void handleResumeActivity(IBinder token, boolean finalStateRequest, boolean isForward, String reason) { // TODO Push resumeArgs into the activity for consideration final ActivityClientRecord r = performResumeActivity(token, finalStateRequest, reason); if (r == null) { // We didn't actually resume the activity, so skipping any follow-up actions. return; } ... ... // 當 MessageQueue 空閒的時候就會執行這個 Handler,即執行完當前 Activity 的 onResume() 方法後執行 Looper.myQueue().addIdleHandler(new Idler()); } }
爲何要單獨討論這行代碼?由於上面分析了棧頂 Activity
的 onPause()
、新 Activity
的 onCreate()、onStart()、onResume()
,但缺失一個棧頂 Activity
的 onStop()
生命週期,此方法就是在這行代碼中處理的。
// frameworks/base/core/java/android/app/ActivityThread.java public final class ActivityThread extends ClientTransactionHandler { private class Idler implements MessageQueue.IdleHandler { @Override public final boolean queueIdle() { ActivityClientRecord a = mNewActivities; boolean stopProfiling = false; if (mBoundApplication != null && mProfiler.profileFd != null && mProfiler.autoStopProfiler) { stopProfiling = true; } if (a != null) { mNewActivities = null; IActivityTaskManager am = ActivityTaskManager.getService(); ActivityClientRecord prev; do { if (localLOGV) Slog.v( TAG, "Reporting idle of " + a + " finished=" + (a.activity != null && a.activity.mFinished)); if (a.activity != null && !a.activity.mFinished) { try { // 調用 ActivityTaskManagerService.activityIdle() 方法 am.activityIdle(a.token, a.createdConfig, stopProfiling); a.createdConfig = null; } catch (RemoteException ex) { throw ex.rethrowFromSystemServer(); } } prev = a; a = a.nextIdle; prev.nextIdle = null; } while (a != null); } if (stopProfiling) { mProfiler.stopProfiling(); } applyPendingProcessState(); return false; } } }
// frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java public class ActivityTaskManagerService extends IActivityTaskManager.Stub { ActivityStackSupervisor mStackSupervisor; @Override public final void activityIdle(IBinder token, Configuration config, boolean stopProfiling) { final long origId = Binder.clearCallingIdentity(); try { WindowProcessController proc = null; synchronized (mGlobalLock) { ActivityStack stack = ActivityRecord.getStackLocked(token); if (stack == null) { return; } // 調用 ActivityStackSupervisor.activityIdleInternalLocked 方法 final ActivityRecord r = mStackSupervisor.activityIdleInternalLocked(token, false /* fromTimeout */, false /* processPausingActivities */, config); if (r != null) { proc = r.app; } if (stopProfiling && proc != null) { proc.clearProfilerIfNeeded(); } } } finally { Binder.restoreCallingIdentity(origId); } } }
// frameworks/base/services/core/java/com/android/server/wm/ActivityStackSupervisor.java public class ActivityStackSupervisor implements RecentTasks.Callbacks { final ActivityRecord activityIdleInternalLocked(final IBinder token, boolean fromTimeout, boolean processPausingActivities, Configuration config) { ... ... // Stop any activities that are scheduled to do so but have been // waiting for the next one to start. for (int i = 0; i < NS; i++) { r = stops.get(i); final ActivityStack stack = r.getActivityStack(); if (stack != null) { if (r.finishing) { stack.finishCurrentActivityLocked(r, ActivityStack.FINISH_IMMEDIATELY, false, "activityIdleInternalLocked"); } else { // 調用 ActivityStack.stopActivityLocked() 方法 stack.stopActivityLocked(r); } } } ... ... return r; } }
// frameworks/base/services/core/java/com/android/server/wm/ActivityStack.java final void stopActivityLocked(ActivityRecord r) { ... ... if (r.attachedToProcess()) { adjustFocusedActivityStack(r, "stopActivity"); r.resumeKeyDispatchingLocked(); try { ... ... EventLogTags.writeAmStopActivity( r.mUserId, System.identityHashCode(r), r.shortComponentName); // 又見面了 mService.getLifecycleManager().scheduleTransaction(r.app.getThread(), r.appToken, StopActivityItem.obtain(r.visible, r.configChangeFlags)); if (shouldSleepOrShutDownActivities()) { r.setSleeping(true); } Message msg = mHandler.obtainMessage(STOP_TIMEOUT_MSG, r); mHandler.sendMessageDelayed(msg, STOP_TIMEOUT); } catch (Exception e) { Slog.w(TAG, "Exception thrown during pause", e); // Just in case, assume it to be stopped. r.stopped = true; if (DEBUG_STATES) Slog.v(TAG_STATES, "Stop failed; moving to STOPPED: " + r); r.setState(STOPPED, "stopActivityLocked"); if (r.deferRelaunchUntilPaused) { destroyActivityLocked(r, true, "stop-except"); } } } } }
又見到了 ClientLifecycleManager.scheduleTransaction()
方法,前面已經分析過屢次,會去執行 StopActivityItem.execute()
方法,而後通過屢次跳轉,最終執行了 Activity.onStop()
方法。
// frameworks/base/core/java/android/app/servertransaction/StopActivityItem.java /** * Request to move an activity to stopped state. * @hide */ public class StopActivityItem extends ActivityLifecycleItem { @Override public void execute(ClientTransactionHandler client, IBinder token, PendingTransactionActions pendingActions) { Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityStop"); // 調用 ActivityThread.handleStopActivity() 方法 client.handleStopActivity(token, mShowWindow, mConfigChanges, pendingActions, true /* finalStateRequest */, "STOP_ACTIVITY_ITEM"); Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER); } }
// frameworks/base/core/java/android/app/ActivityThread.java public final class ActivityThread extends ClientTransactionHandler { @Override public void handleStopActivity(IBinder token, boolean show, int configChanges, PendingTransactionActions pendingActions, boolean finalStateRequest, String reason) { ... ... performStopActivityInner(r, stopInfo, show, true /* saveState */, finalStateRequest, reason); ... ... } }
// frameworks/base/core/java/android/app/ActivityThread.java public final class ActivityThread extends ClientTransactionHandler { private void performStopActivityInner(ActivityClientRecord r, StopInfo info, boolean keepShown, boolean saveState, boolean finalStateRequest, String reason) { if (r != null) { ... ... if (!keepShown) { callActivityOnStop(r, saveState, reason); } } } }
// frameworks/base/core/java/android/app/ActivityThread.java public final class ActivityThread extends ClientTransactionHandler { private void callActivityOnStop(ActivityClientRecord r, boolean saveState, String reason) { final boolean shouldSaveState = saveState && !r.activity.mFinished && r.state == null && !r.isPreHoneycomb(); final boolean isPreP = r.isPreP(); if (shouldSaveState && isPreP) { callActivityOnSaveInstanceState(r); } try { // 調用 Activity.performStop() 方法 r.activity.performStop(r.mPreserveWindow, reason); } catch (SuperNotCalledException e) { throw e; } catch (Exception e) { if (!mInstrumentation.onException(r.activity, e)) { throw new RuntimeException( "Unable to stop activity " + r.intent.getComponent().toShortString() + ": " + e.toString(), e); } } r.setState(ON_STOP); if (shouldSaveState && !isPreP) { callActivityOnSaveInstanceState(r); } } }
// frameworks/base/core/java/android/app/Activity.java public class Activity extends ContextThemeWrapper implements LayoutInflater.Factory2, Window.Callback, KeyEvent.Callback, OnCreateContextMenuListener, ComponentCallbacks2, Window.OnWindowDismissedCallback, WindowControllerCallback, AutofillManager.AutofillClient, ContentCaptureManager.ContentCaptureClient { final void performStop(boolean preserveWindow, String reason) { ... ... if (!mStopped) { dispatchActivityPreStopped(); if (mWindow != null) { mWindow.closeAllPanels(); } ... ... mInstrumentation.callActivityOnStop(this); ... ... mStopped = true; dispatchActivityPostStopped(); } mResumed = false; } }
// frameworks/base/core/java/android/app/Instrumentation.java public class Instrumentation { public void callActivityOnStop(Activity activity) { activity.onStop(); } }