本來是想寫下activity生命周期的調度過程,但是想想直接寫的話有點突兀,感覺還是先分析下activity的啟動然后在分析生命周期比較順暢。BTW,第一次用markdown語法寫希望好用。
這里的分析是基于7.0的源碼并且只分析一般的啟動過程,沒有forResult,也考慮特殊的launchMode.還有就是描述寫的不多,只是記錄調用的過程。
1.As we all know, activity啟動其它activity是通過Instrumentation完成的,所以這里直接從Instrumentation開始.
/>android.app.Instrumentation.execStartActivity()
int result = ActivityManagerNative.getDefault()
.startActivity(whoThread, who.getBasePackageName(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()),
token, target != null ? target.mEmbeddedID : null,
requestCode, 0, null, options);
這里的ActivityManagerNative.getDefault得到的是一個ActivityManagerProxy單例對象,其中封裝了對ActivityManagerService的IBinder對象的調用。總之最后調用的是ActivityManagerService的startActivity。
/>com.android.server.am.ActivityManagerService
@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) {
return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
resultWho, requestCode, startFlags, profilerInfo, bOptions,
UserHandle.getCallingUserId());
}
2.ActivityManagerService執行過程. 代碼太多,只記錄下方法的調用流程。并且這里假設要啟動的activity所在進程還沒啟動。
--數字 代表當前方法調用下個方法的代碼行號
-
> ActivityManagerService.startActivityAsUser() --4399
-
ActivityStarter.startActivityMayWait() --860
-
ActivityStarter.startActivityLocked() --516
-
ActivityStarter.startActivityUnchecked() --1243
-
ActivityStackSupervisor.resumeFocusedStackTopActivityLocked() --1830
-
ActivityStack.resumeTopActivityUncheckedLocked() --2127
-
ActivityStack.resumeTopActivityInnerLocked() --2269
-
ActivityStackSupervisor.pauseBackStacks() --961 這一步是遍歷所有后臺ActivityStack,查看是否有resumed狀態的Activity存在,存在則招待pause操作
-
ActivityStack.startPausingLocked() --1141
ApplicationThread.schedulePauseActivity() 這一步是調用要執行pause操作的activity所在進程的ApplicationThread.schedulePauseActivity方法, 在應用的進程中停止activity,然后AMS的工作就暫時完成了。
-
-
-
-
-
-
-
-
應用進程執行activity的pause操作完成后,會通過應用進程的ActivityThread回調AMS的activityPaused方法
-
ActivityThread.handlePauseActivity() --3697
-
ActivityManagerService.activityPaused() --7006
-
ActivityStack.activityPaused() --1212
-
ActivityStack.completePauseLocked() --1332
-
ActivityStackSupervisor.resumeFocusedStackTopActivityLocked() --1830
-
ActivityStack.resumeTopActivityUncheckedLocked() --2127
-
ActivityStack.resumeTopActivityInnerLocked() --2577
-
ActivityStackSupervisor.startSpecificActivityLocked() --1420 這里會判斷當前要啟動的Activity的進程是否啟動
-
ActivityManagerService.startProcessLocked() --3547
-
ActivityManagerService.startProcessLocked() --3666
*ActivityManagerService.startProcessLocked() --3832
*Process.start() 這里通過Zygote進程創建一個新進程。AMS的工作暫時完成,需要等新進程回調AMS才繼續啟動Activity的操作。
-
-
-
-
-
-
-
-
-
新進程創建成功后會執行ActivityThread的main方法,并通過attach方法調用AMS的attachApplication方法和AMS進行綁定操作。AMS又通過調用ApplicationThread的bindApplication方法通知綁定成功,然后應用進程會創建應用的Application和Instrumentation等對象,回調結束后AMS接著做下面的操作
-
ActivityManagerService.attachApplicationLocked() --6693
-
ActivityStackSupervisor.attachApplicationLocked() --866 這里會遍歷查找需要顯示的Activity,也就是之前想要啟動的Activity
-
ActivityStackSupervisor.realStartActivityLocked() --1310
ApplicationThread.scheduleLaunchActivity() --over
-
-
***到這Activity啟動就算結束了,后面就是通過IPC調用應用進程的ApplicationThread執行真正的創建activity并展示的操作了。 ***