從啓動一個app 到 Activity的啓動過程

Launcher 調用 startActivitySafely()

主要給意圖添加一個

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); ///設置成

就會調用Activity裏面的

startActivity

在裏面會調用startActivityForResult

在startActivityForResult 會有一個是否是mParent的判斷是不是根Activity

有個類 Instrumentation 主要用來監控應用程序和系統的交互

然後調用 instrumentation的 execStartActivity

裏面通過ActivityManager.getService() 的方法去調用startActivity

 

 

//Laucher 和AMS 獲取AMS的代理對象

看一下ActivityManager的getService的方法

這裏用了IActivityManagerSingleton的單例

在API28裏面用的ActivityManagerProxy的代理 方式

最後 調用的AMS 裏面的startActivity

結合上面說的

 

AMS到ApplicationThread的調用過程

 

看一下AMS 裏面的startActivity 。 裏面調用了 startActivityAsUser 比startActicity 多了一個參數

UserHandle.getCallingUserId();//AMS通過UserId 來確定調用者多權限問題

在這個裏面做兩個判斷和處理

1 判斷調用者進程是否唄隔離

2檢查調用者多權限

 

 

AMS 調用startActivity-》 startActivityAsUser

最後返回ActivityStarter 調用 startActivityMayWait

在該方法裏面調用startActivityLocked的方法(在API28 中說startActivity)

最後還是調用ActivityStarter裏面的startActivity的方法

重點說一下這個startActivity的方法

IApplicationThread 類型的caller 是否爲空 是各種方法一路通過傳值的方法傳過來的

會通過ActivityRecord 記錄一個Activity的所有信息這個被記錄的Activity 會被作爲參數傳下去

在ActivityStarter的startActivity裏面startActivity裏面startActivityUnchecked()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章