Android 啓動Activity面流程(Android 9.0)

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啓動代碼流程這篇博客的流程,主要是這個流程的東西沒啥區別,而這篇博客的確比較詳細,而且我驗證過這個流程沒有問題。我重新在這裏梳理一次的目的是在這個流程基礎上做詳細說明,當然現在還沒弄,後面找到時間再來好好說說

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