天天看點

android activity管理(二) activity啟動流程,(ActivityClientRecord)android activity管理(二) activity啟動流程,(ActivityClientRecord)

android activity管理(二) activity啟動流程,(ActivityClientRecord)

ActivityClientRecord 是Apk程序中一個Activity代表,這個對象的activity成員引用真正的Activity元件,一個Activity涉及到哪些對象呢?

  1. Activity子類 ,應用實作的Activity實體。
  2. ContextImpl 接口就是我們非常資料的Context。
  3. PhoneWindow 接口是Window,這個對象可以了解為窗體用戶端,維護的是布局XML檔案,負責解析和加載控件。
  4. DecorView 頂層控件,應用建立的控件隻是它的子控件。
  5. ViewRootImpl 這個對象可以了解為渲染引擎,負責渲染PhoneWindow中的控件到surface上。
  6. Surface 窗體的顯示載體。

一個Activity的顯示,在Apk程序中基本分成三個步驟:一個是解析XML檔案加載控件。第二個是請求一個系統窗體傳回一個Surface,第三個是将控件畫到surface上。

HandleLaunchActivity()方法

1、調用handleConfigurationChanged()更新資源配置。

2、調用WindowManagerGlobal:initialize()方法初始化全局視窗管理系統,每一個Apk程序一個WindowManagerGlobal對象。

3、調用performLaunchActivity()拉起activity。

4、調用handleResumeActivity()喚醒activity。

第三步和第四步是核心,第四步下面會降到,現在主要分析preformLanchActivity()方法。

1、加載Activity,

2、建立Context。

3、activity連接配接Context。

4、調用ActivityOncreate()方法。

performLanuchActivity() 這個執行流程中Oncreate方法需要調用Activity::setContentView(),setContentView()負責設定XML檔案到phoneWindow,phoneWindow負責解析加載控件樹,這個方法執行完,Activity啟動的第一步就完成了。

handleResumeActivity()方法

1、調用performResumeAvtivity()方法,這個方法主要負責調用Activity中的onResume方法。

2、添加控件到視窗管理系統,windowManager.addView()添加DecorView控件樹,建立ViewRootImpl,ViewRootImpl從視窗管理系統請求一個窗體,傳回這個窗體的Surface,然後将控件樹渲染Surface上,送出視窗管理系統顯示,這裡有一點需要注意,渲染的過程是UI的下一個事件是以當下面的第三步上報的時候還沒有畫完呢。

3、調用activityResumed()上報已經喚醒狀态。

HandlerPauseActivity()方法。

1、回調Activity的onPause()方法。

2、調用activityPause()上報狀态給activityManagerService。

handleStopActivity方法

1、儲存狀态。

2、回調Activity的Onstop方法。

handleDestroyActivity方法。

1、回調Activity的OnDestroy方法

2、清楚上下文。

3、調用activirtDestroyed()上報狀态給ActivityManagerService

handleRelaunchActivity()方法

relaunch就是先銷毀在啟動,這個一個很暴力的方法,沒有資料可以服用,大家可以研究研究,對暴力的方法改為部分資料可以服用,就是一種對系統的優化,但是千萬不要引入問題哦。