像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方法如下:



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







1.首先在ActivityThread的主執行緒,生成一個ApplicationThread物件,這個物件式能夠對外提供遠端服務的,換句話說別的程式可以通過這個物件的本地代理與我這個ActivityThread的主執行緒(ApplicationThread物件)通訊
2.獲取系統服務ActivityManager的本地代理物件
3.將生成的ApplicationThread物件通過ActivityManager的本地代理物件“傳送”給系統服務ActivityManager,這樣系統服務ActivityManager會"生成"ApplicationThread物件的本地代理,到此主執行緒與系統服務ActivityManager之間的“雙工”通訊通道就建立了
4.當你想要啟動一個Activity的時候,系統服務ActivityManager就會呼叫ApplicationThread物件的本地代理的scheduleLaunchActivity方法,這樣主執行緒的scheduleLaunchActivity也會相應的被呼叫,至此開始了Activity生命週期函式的回撥。