Activity啟動過程簡單記錄

本來是想寫下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并展示的操作了。 ***

總結:Activity的啟動先對之前resumed的activity執行pause操作,然后在AMS回調方法activityPaused方法中重啟啟動activity的過程,然后又因為應用進程沒啟動,AMS調用Zygote進程創建應用進程。應用進程創建成功后會和AMS綁定,綁定完成后AMS又重新開啟啟動activity的過程,直到調用應用進程的ApplicationThread的scheduleLaunchActivity。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容