Android Activity啟動三部曲(一)

weixin_34236497發表於2017-10-11

背景

  本章作為Activity啟動流程的第一篇,將對呼叫過程到ActivityManagerService(以下簡稱AMS)之前的工作做以說明,並對下一篇執行過程做鋪墊。
  計劃在第二篇講解到啟動新程式中,為啟動Activity做準備(已完成)
  在第三篇,主要講解如何在新程式中啟動Activity,以及Activity各種宣告週期的回撥(已完成)
  使用原始碼:Nougat - 7.0.0_r1

Activity啟動(一)

首先來通過一張大圖,看看Activity的啟動過程,在這一部分中,將呼叫過程先截止到AMS。

5297002-684fb99e03d03f4f.png
Activity啟動過程(一)

說明:

  • 其實,不管是根 Activity( 在Intent Filter中標記為Launcher和Main)或者子 Activity(除了根Activity的其他Activity),它們的 start 過程,都將會由上圖中的 Instrumentation 執行 execStartActivity。
  • 通過 Instrumentation 的 execStartActivity 方法,得到一個單例,即上圖中的 gDefault ,這個單例實際上是 AMS 提供給客戶端的代理。順便說一句,這種單例方式為一種外掛化方式提供了良好的基礎,可以Hook掉這個 gDefault,搞事情。具體可參考
  • 最終執行到了 AMS代理類中的 startActivity 方法。這裡將進行Binder通訊。如果對Binder機制不清楚,可以參看這裡,startActivity請求最終由AMS代理類通過Binder機制傳送到 AMS 服務端,交給AMS處理,這是標準的CS架構。
  • 為啥要交給 AMS 處理呢?startActivity將會啟動一個非常重要的元件,這麼大的事,必須要交給系統集中處理、管理。正如在十字路口,如果沒有紅綠燈,用不了多久,交通就會癱瘓。AMS 通過資料結構集中對所有的Activity進行管理,為如絲般順滑地使用者體驗提供基礎的基礎的基礎。

小結

  本節體現了Binder通訊機制,以及建立在該機制之上的服務提供方和客戶端的CS架構。
  AMS是大家的AMS,只有一個,但是卻有很多的App,每個App都可以通過AMS提供的代理類和AMS進行通訊。請求AMS處理資料,比如開啟一個新的Activity。AMS是所有Activity的處理中心,記錄儲存追蹤著所有的Activity。
  下一節,我們來看看 AMS 如何處理 startActiviy的請求。

相關文章