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()