Android開發過程中,可以說接觸最多的就是啓動Activity了,實際上從Launcher打開一個應用就是啓動一個Activity了,我們可以從這點出來來梳理下Android啓動Activity的具體流程,順帶也理一下ActivivtyManagerService的工作原理。
1、Launcher通知AMS啓動一個Activity
Launcher.java
startActivitySafely()
→ startActivity()
Activity.java
startActivity()
→ startActivityForResult(mInstrumentation.execStartActivity())
Instrumentation.java
execStartActivity(ActivityManager.getService().startActivity())
這一步中,ActivityManager同過Binder通信(AIDL方式實現)調用起AMS中的startActivity方法
ActivityManagerService.java
startActivity()
→ startActivityAsUser()
ActivityStarter.java
execute()
→ startActivityMayWait(int res = startActivity())
→ startActivity(mLastStartActivityResult = startActivity())
→ startActivity(result = startActivityUnchecked())
→ startActivityUnchecked(mSupervisor.resumeFocusedStackTopActivityLocked())
ActivityStackSupervisor.java
resumeFocusedStackTopActivityLocked()
ActivityStack.java
resumeTopActivityUncheckedLocked(result = resumeTopActivityInnerLocked())
→ resumeTopActivityInnerLocked(pausing |= startPausingLocked())
→ startPausingLocked()
這一步將開始讓Launcher頁進入Pausing狀態,下一個小節對這裏的startPausingLocked方法展開梳理
2、AMS通知Launcher進入Pausing狀態
ActivityStack.java
startPausingLocked(mService.getLifecycleManager().scheduleTransaction())
ClientLifecycleManager.java
scheduleTransaction(transactionWithState())
→ scheduleTransaction(transaction.schedule())
ClientTransaction.java
schedule(mClient.scheduleTransaction(this))
mClient是IApplicationThread,ActivityThread中ApplicationThread extends IApplicationThread.Stub,這裏我的理解是ActivityThread實際上也是一個Binder Server,這裏通過Binder通信調用到ActivityThread中的scheduleTransaction方法
ActivityThread.java
scheduleTransaction(ActivityThread.this.scheduleTransaction())
ClientTransactionHandler.java
scheduleTransaction(sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction))
ActivityThread.java
handleMessage(case EXECUTE_TRANSACTION)
TransactionExecutor.java
execute(executeLifecycleState(transaction))
在executeLifecycleState方法中有以下兩個重要的調用分支,這點要注意
分支1:
lifecycleItem.execute(mTransactionHandler, token, mPendingActions)
→ PauseActivityItem.execute()
→ ClientTransactionHandler.handlePauseActivity()
分支2:
lifecycleItem.postExecute(mTransactionHandler, token, mPendingActions)
→PauseActivityItem.postExecute(ActivityManager.getService().activityPaused(token))
lifecycleItem是在startPausingLocked方法中傳入的PauseActivityItem變量,所以這裏的execute以及postExecute都執行到了PauseActivityItem方法中
ActivityThread.java
handlePauseActivity(performPauseActivity())
→ performPauseActivityIfNeeded(mInstrumentation.callActivityOnPause())
上面代碼是基於分支1的展開
Instrumentation.java
callActivityOnPause(activity.performPause())
Activity.java
performPause() → onPause()
到這裏Launcher便進入了Pausing的狀態,緊接着前面第二個分支就開始執行,啓動新的Activity,我們也由此可見,前一個activity得執行完onPause後新的Activity纔開始啓動。
3、啓動新的Activity
啓動新的activiy從分支2開始執行,注意這裏代碼是執行在Launcher的ActivityThread中的,通過Binder通信調用AMS的activityPaused方法
ActivityManager.getService().activityPaused(token)
ActivityManagerService.java
activityPaused(stack.activityPausedLocked())
ActivityStack.java
activityPausedLocked(completePauseLocked(true, null))
→ completePauseLocked(mStackSupervisor.resumeFocusedStackTopActivityLocked())
ActivityStackSupervisor.java
resumeFocusedStackTopActivityLocked(return targetStack.resumeTopActivityUncheckedLocked())
ActivityStack.java
resumeTopActivityUncheckedLocked()
→ resumeTopActivityInnerLocked(mStackSupervisor.startSpecificActivityLocked(next, true, true))
ActivityStackSupervisor.java
startSpecificActivityLocked(mService.startProcessLocked())
這裏的mService持有AMS的引用
ActivityManagerService.java
startProcessLocked()
→ startProcess(startResult = Process.start())
需要注意的是startProcessLocked方法中關鍵代碼:
final String entryPoint = “android.app.ActivityThread”;
return startProcessLocked(…, entryPoint, …);
Process.java
start(return zygoteProcess.start())
ZygoteProcess.java
start() → startViaZygote() → zygoteSendArgsAndGetResult()
ActivityThread.java
main()
到這裏新的App的進程就啓動起來了。
4、AMS如何持有新進程的Binder對象
ActivityThread.java
main(thread.attach(false, startSeq))
→ attach(mgr.attachApplication(mAppThread, startSeq))
ActivityManagerService.java
attachApplication()
→ attachApplicationLocked(mStackSupervisor.attachApplicationLocked(app))
這裏ActivityThread通過Binder通信將一個ApplicationThread類型的Binder對象傳遞給ActivityManagerService,以便以後ActivityManagerService能夠通過這個Binder對象和它進行通信
5、AMS通知ActivityThread啓動Activity
ActivityStackSupervisor.java
attachApplicationLocked()
→realStartActivityLocked(mService.getLifecycleManager().scheduleTransaction(clientTransaction))
ActivityThread.java
scheduleTransaction(ActivityThread.this.scheduleTransaction())
ClientTransactionHandler.java
scheduleTransaction(sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction))
ActivityThread.java
handleMessage(case EXECUTE_TRANSACTION)
TransactionExecutor.java
execute(executeCallbacks(transaction) && executeLifecycleState(transaction))
注意這裏又有兩個分支
分支1:executeCallbacks()
LaunchActivityItem.execute(ActivityThread.handleLaunchAcitivity(final Activity a = performLaunchActivity(r, customIntent)))
ActivityThread.java
performLaunchActivity(mInstrumentation.callActivityOnCreate())
Instrumentation.java
callActivityOnCreate(activity.performCreate(icicle, persistentState))
Activity.java
performCreate()
→ onCreate()
分支2:executeLifecycleState()
這裏需要說明以下幾點
1、 realStartActivityLocked中的scheduleTransaction中的mClient是與系統進程通信的服務端,即ActivityThread.ApplicationThread,即此處調用的是ActivityThread.ApplicationThread.scheduleTransaction
2、 executeCallbacks中的lifecycleItem是realStartActivityLocked中加入的clientTransaction.addCallback(LaunchActivityItem.obtain())
3、 executeLifecycleState中先執行cycleToPath走onStart流程,然後onResume等等,由於本文主要記載activity啓動過程AMS的運轉,所以到onCreate就行了。
4、 ActivityThread繼承了ClientTransactionHandler,將原先放在ActivityThread裏面的handleLaunchActivity、handlerStartActivity等等抽取出來,放到ClientTransactionHandler類中,作爲抽象方法。
這篇博客目前基本是引用了Android P ActivityManagerService(一)Activity啓動代碼流程這篇博客的流程,主要是這個流程的東西沒啥區別,而這篇博客的確比較詳細,而且我驗證過這個流程沒有問題。我重新在這裏梳理一次的目的是在這個流程基礎上做詳細說明,當然現在還沒弄,後面找到時間再來好好說說