1. 程式人生 > >Activity生命周期回調是如何被回調的?

Activity生命周期回調是如何被回調的?

總結 binder ram sta 生命周期 就會 ava 接下來 創建

  作者:鐘離四郎

  鏈接:

  https://www.jianshu.com/p/91984327690e

  本文由作者授權發布。

  像java程序有main方法作為入口一樣,Android程序也有入口,ActivityThread的main方法就是Android程序的入口,如下圖:

  接著看到調用ActivityThread的attach方法,如下:

  mAppThread對象究竟是什麽類型呢?如下:

  回到 mgr.attachApplication(mAppThread);上圖標記為B的地方,mgr本身是IActivityManager是一個接口,它的繼承樹結構如下圖,上面我剛才提到mgr是系統服務ActivityManager的本地代理,所以這裏mgr實際類型是Proxy,所以mgr.attachApplication(mAppThread)實際是調用的是Proxy裏面的attachApplication方法,如下:

  如果 mgr.attachApplication(mAppThread)調用完成了之後,Android與系統服務ActivityManager之間“雙工”通信信道就建立完畢了,為了方便你理解我畫一個圖,如下:

  上文我分析過ActivityManager系統服務在擁有ApplicationThread本地代理之後,就可以控制Android程序的主線程,比方說啟動LaunchActivity,只要調用ApplicationThread本地代理的scheduleLaunchActivity則會引起Android程序ApplicationThread.Stub的scheduleLaunchActivity被調用

  你理解Binder的機制的話 ,這些其實都很好理解,如果你不理解的話可以看看我之前寫的Binder機制文章:

  https://www.jianshu.com/p/5de1718454f8

  ApplicationThread.Stub的scheduleLaunchActivity方法如下:

  上圖提到在加載Activity的時候,會在主線程調用sendMessage,下文就看看sendMessage裏面有什麽玄機,如下:

  mH.sendMessage(msg); 會導致ActivityThread.H的handleMessage被調用如下:

  上圖C處代碼跳轉如下:

  D處代碼跳轉如下:

  可以看到在performLaunchActivity中首先是創建了一個Activity,然後調用

  mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);準備調用Activity的onCreat函數,我們進入這個方法看看是不是如此,如下:

  如上圖看到的performCreat裏面就是回調了Activity的onCreat方法,至此onCreate的回調流程就分析清楚了,接著回到上文標記E的地方還記得嗎,不記得往上翻,是調用了 handleResumeActivity方法,看名字就知道這是Activity 的onResume相關的,onCreat都被調用了,接下來是OnResume,這和我們以前學習的Activity的生命周期很符合呀,嗯,不多說進去看看是什麽情況:

  看到沒,接下去的跳轉和onCreate部分很相似,不再分析了,至此你應該知道Activity的生命周期是怎麽被調用的吧,或許你還是有點模糊,那我下面幫你總結一下吧:

  1.首先在ActivityThread的主線程,生成一個ApplicationThread對象,這個對象式能夠對外提供遠程服務的,換句話說別的進程可以通過這個對象的本地代理與我這個ActivityThread的主線程(ApplicationThread對象)通信;

  2.獲取系統服務ActivityManager的本地代理對象

  3.將生成的ApplicationThread對象通過ActivityManager的本地代理對象“發送”給系統服務ActivityManager,這樣系統服務ActivityManager會"生成"ApplicationThread對象的本地代理,到此主線程與系統服務ActivityManager之間的“雙工”通信信道就建立了

  4.當你想要啟動一個Activity的時候,系統服務ActivityManager就會調用ApplicationThread對象的本地代理的scheduleLaunchActivity方法,這樣主線程的scheduleLaunchActivity也會相應的被調用,至此開始了Activity生命周期函數的回調。

  代碼較多,下面由我給大家再次簡單總結下:

  Activity 的啟動,實際上是一個進程間交互的過程,即本地app 與 AMS 交互,涉及到兩點:

  本地app -> AMS : 給 AMS 各種參數,要求啟動 Activity

  AMS -> 本地app : AMS處理完了,回調本地 app Activity 生命周期

  可以看到這兩個進程間相互通信,那麽就找 Binder 就好了,從app -> AMS,這個比較簡單,通過 ServiceManager.getService 拿到 AMS 的代理對象(Binder)即可和 AMS 通信。

  而 AMS -> app 則如上文所說,我們在 ActivityThread 中創建了一個 ApplicationThread (Binder) 對象傳遞給 AMS 的。

  推薦閱讀:

  AccessibilityService 你了解原理嗎?

  推薦幾個好用的 Studio 插件

  如何排查列表卡頓問題

  是時候來學習 Kotlin 了

  grepcode關了有段時間了,大家是如何閱讀framework源碼的呢? 歡迎留言,也準備給大家分享一波如何方便的閱讀framework 代碼,敬請期待

  大連婦科醫院 http://www.dlwtrlyy.com/

  大連婦科醫院醫生團隊 http://www.62671288.com/

Activity生命周期回調是如何被回調的?