Activity生命週期回撥是如何被回撥的?

鍾離四郎發表於2018-07-26

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

image.png

接著看到呼叫ActivityThread的attach方法,如下:

image.png

mAppThread物件究竟是什麼型別呢?如下:

image.png

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

image.png

image.png

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

image.png

上文我分析過ActivityManager系統服務在擁有ApplicationThread本地代理之後,就可以控制Android程式的主執行緒,比方說啟動LaunchActivity,只要呼叫ApplicationThread本地代理的scheduleLaunchActivity則會引起Android程式ApplicationThread.Stub的scheduleLaunchActivity被呼叫,你理解Binder的機制的話 ,這些其實都很好理解,如果你不理解的話可以看看我之前寫的Binder機制文章:https://www.jianshu.com/p/5de1718454f8 ApplicationThread.Stub的scheduleLaunchActivity方法如下:

image.png
上圖提到在載入Activity的時候,會在主執行緒呼叫sendMessage,下文就看看sendMessage裡面有什麼玄機,如下:
image.png

image.png

mH.sendMessage(msg); 會導致ActivityThread.H的handleMessage背呼叫如下:

image.png
image.png
上圖C處程式碼跳轉如下:
image.png
D處程式碼跳轉如下:
image.png
可以看到在performLaunchActivity中首先是建立了一個Activity,然後呼叫 mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);準備呼叫Activity的onCreat函式,我們進入這個方法看看是不是如此,如下:
image.png
image.png
如上圖看到的performCreat裡面就是回撥了Activity的onCreat方法,至此onCreate的回撥流程就分析清楚了,接著回到上文標記E的地方還記得嗎,不記得往上翻,是呼叫了 handleResumeActivity方法,看名字就知道這是Activity 的onResume相關的,onCreat都被呼叫了,接下來是OnResume,這和我們以前學習的Activity的生命週期很符合呀,嗯,不多說進去看看是什麼情況:
image.png
看到沒,接下去的跳轉和onCreat部分很相似,不再分析了,至此你應該知道Activity的生命週期是怎麼被呼叫的吧,或許你還是有點模糊,那我下面幫你總結一下吧:

1.首先在ActivityThread的主執行緒,生成一個ApplicationThread物件,這個物件式能夠對外提供遠端服務的,換句話說別的程式可以通過這個物件的本地代理與我這個ActivityThread的主執行緒(ApplicationThread物件)通訊

2.獲取系統服務ActivityManager的本地代理物件

3.將生成的ApplicationThread物件通過ActivityManager的本地代理物件“傳送”給系統服務ActivityManager,這樣系統服務ActivityManager會"生成"ApplicationThread物件的本地代理,到此主執行緒與系統服務ActivityManager之間的“雙工”通訊通道就建立了

4.當你想要啟動一個Activity的時候,系統服務ActivityManager就會呼叫ApplicationThread物件的本地代理的scheduleLaunchActivity方法,這樣主執行緒的scheduleLaunchActivity也會相應的被呼叫,至此開始了Activity生命週期函式的回撥。

相關文章