深入理解Activity啟動流程(三)–Activity啟動的詳細流程1
本系列部落格將詳細闡述Activity的啟動流程,這些部落格基於Cm 10.1原始碼研究。
本篇部落格將開始介紹Activity啟動的詳細流程,由於詳細啟動流程非常複雜,故此分成兩篇來介紹。
本篇主要介紹前半部分的啟動流程:
- 1. Activity呼叫ActivityManagerService啟動應用
- 2. ActivityManagerService呼叫Zygote孵化應用程序
- 3. Zygote孵化應用程序
下篇介紹後半部分的啟動流程:
- 4. 新程序啟動ActivityThread
- 5. 應用程序繫結到ActivityManagerService
- 6. ActivityThread的Handler處理啟動Activity的訊息
1. Activity呼叫ActivityManagerService啟動應用
點選圖片可看大圖
在launcher應用程式裡啟動應用時,點選應用圖示後,launcher程式會呼叫startActivity啟動應用,傳遞的intent引數:
1 2 3 |
intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); intent.setComponent(className); |
activity最終呼叫Instrumentation的execStartActivity來啟動應用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//Activity類 public void startActivityForResult(Intent intent, int requestCode, Bundle options) { if (mParent == null) { Instrumentation.ActivityResult ar = mInstrumentation.execStartActivity( this, mMainThread |
Instrumentation呼叫ActivityManagerProxy物件的startActivity方法啟動Activity,而ActivityManagerProxy只是ActivityManagerService物件在應用程序的一個代理物件,ActivityManagerProxy最終呼叫ActivityManagerService的startActvity方法啟動Activity。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//Instrumentation類 public ActivityResult execStartActivity( Context who, IBinder contextThread, IBinder token, Activity target, Intent intent, int requestCode, Bundle options) { //... try{ //... int result = ActivityManagerNative.getDefault() .startActivity(whoThread, intent, intent.resolveTypeIfNeeded(who.getContentResolver()), token, target != null ? target.mEmbeddedID : null, requestCode, 0, null, null, options); } catch (RemoteException e) { } //... } |
2. ActivityManagerService呼叫Zygote孵化應用程序
點選圖片可看大圖
ActivityManagerProxy物件呼叫ActivityManagerService物件(執行在system_server程序)的startActivity方法以啟動應用,startActivity方法接下來呼叫startActivityAsUser方法以啟動應用。在startActivityAsUser方法裡會呼叫ActivityStack的startActivityMayWait方法以啟動應用,startActivityMayWait方法裡啟動應用時,需先根據intent在系統中找到合適的應用的activity,如果有多個activity可選擇,則會彈出ResolverActivity讓使用者選擇合適的應用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
//ActivityStack類 final int startActivityMayWait(IApplicationThread caller, int callingUid, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, String |