1. 程式人生 > 其它 >Android-AMS(三)-startActivity流程分析

Android-AMS(三)-startActivity流程分析

  • app程序通過ActivityManager.getService (高版本)或者 ActivityManagerNative.getDefault(低版本)返回的IActivityManager來呼叫系統程序AMS中的方法。該IActivityManager是AMS在app程序的binder代理物件
  • 同樣,系統程序通過ProcessRecord.IApplicationThread呼叫app程序相關方法。IApplicationThread是系統程序持有的app程序中ApplicationThread的Binder代理物件。
  • AMS通過binder代理呼叫到ApplicationThread(ActivityThread的內部類)中的方法後,通過主執行緒(ActivityThread中的main方法)中開啟的handler訊息輪詢來通知主執行緒呼叫相關方法。主執行緒的相關宣告週期方法的具體實現會委託給Instrumentation類實現,在Instrumentation類中,會呼叫具體元件的相關生命週期方法。
  • 這裡主要分析從Instrumentation.execStartActivity()開始,前面的流程就不在這裡提了。很基礎的東西。這裡主要是從Instrumentation.execStartActivity()開始。

execStartActivity的程式碼如下,應用程式在呼叫startActivity時都會走到這裡,這裡就會呼叫AMS的startActivityAsUser()方法啟動Activity

 

AMS的startActivityAsUser()會呼叫到ActivityStarter.startActivityMayWait().   在AMS裡面。其實Activity的啟動是在ActivityStarter裡面完成的。

 

 

startActivityMayWait()很長,我們找到關鍵部分,程式碼如下

 

 跟蹤startActivityLocked()。我們發現它呼叫了startActivity(),程式碼如下:

 

 這裡的startActivity()有過載,最終會走到這個startActivity()  這裡呼叫了startActivityUnchecked(),程式碼如下:

 

 跟進startActivityUnchecked()裡面,其實到這裡才開始真正意義上的啟動一個Activity.程式碼如下,啟動一個Activity主要的做了三件事:

  • 根據Activity的四種啟動模式和啟動標誌位來決定如何啟動Activity
  • 啟動Activity,並呼叫Activity的生命週期,並使其獲得焦點事件
  • 通知Activity,有一個Intent試圖啟動它

 

 跟resumeFocusedStackTopActivityLocked()發現期呼叫了resumeTopActivityUncheckedLocked(),繼續跟蹤該方法。發現呼叫了resumeTopActivityInnerLocked(),還是跟。發現其呼叫了mStackSupervisor.startSpecificActivityLocked()。跟到這裡。程式碼如下:

 

 這裡開始準備呼叫Zygote去建立新程序了,建立程序的流程,這裡不在跟蹤,有興趣的可以自行了解。如果想看這一塊的內容,請移步到Android 程序建立流程分析跟Android系統啟動流程分析。這裡不在做過多介紹。我們移步到程序建立之後的流程裡。這裡我們用時序圖做一下簡要交代,呼叫Activity最終會呼叫到scheduledLaunchActivity()。時序圖如下:

 

上圖第九步後面的流程。由於時間關係。不在跟蹤,我已經整理成xmind文件,有興趣瞭解的可以自行跟蹤。xmind文件如下: