本系列部落格将詳細闡述Activity的啟動流程,這些部落格基于Cm 10.1源碼研究。
<a href="http://www.cloudchou.com/android/post-788.html" target="_blank">深入了解Activity啟動流程(一)--Activity啟動的概要流程</a>
<a href="http://www.cloudchou.com/android/post-793.html" target="_blank">深入了解Activity啟動流程(二)--Activity啟動相關類的類圖</a>
<a href="http://www.cloudchou.com/android/post-805.html" target="_blank">深入了解Activity啟動流程(三)--Activity啟動的詳細流程1</a>
<a href="http://www.cloudchou.com/android/post-858.html" target="_blank">深入了解Activity啟動流程(四)--Activity Task的排程算法</a>
上篇部落格介紹了Activity詳細啟動流程的前半部分:
1. Activity調用ActivityManagerService啟動應用
2. ActivityManagerService調用Zygote孵化應用程序
3. Zygote孵化應用程序
本篇部落客要介紹Activity詳細啟動流程的後半部分:
4. 新程序啟動ActivityThread
5. 應用程序綁定到ActivityManagerService
6. ActivityThread的Handler處理啟動Activity的消息
<a href="http://www.cloudchou.com/wp-content/uploads/2015/05/zygote_activitythread.png" target="_blank"></a>
Zygote程序孵化出新的應用程序後,會執行ActivityThread類的main方法。在該方法裡會先準備好Looper和消息隊列,然後調用attach方法将應用程序綁定到ActivityManagerService,然後進入loop循環,不斷地讀取消息隊列裡的消息,并分發消息。

在ActivityThread的main方法裡調用thread.attach(false);attach方法的主要代碼如下所示:
ActivityManagerService的attachApplication方法執行attachApplicationLocked(thread, callingPid)進行綁定。
attachApplicationLocked方法有兩個重要的函數調用thread.bindApplication和mMainStack.realStartActivityLocked。thread.bindApplication将應用程序的ApplicationThread對象綁定到ActivityManagerService,也就是說獲得ApplicationThread對象的代理對象。mMainStack.realStartActivityLocked通知應用程序啟動Activity。
thread對象其實是ActivityThread裡ApplicationThread對象在ActivityManagerService的代理對象,故此執行thread.bindApplication,最終會調用ApplicationThread的bindApplication方法,該方法的主要代碼如下所示:
這樣調用queueOrSendMessage會往ActivityThread的消息隊列發送消息,消息的用途是BIND_APPLICATION。
這樣會在handler裡處理BIND_APPLICATION消息,接着調用handleBindApplication方法處理綁定消息。
realStartActivity會調用scheduleLaunchActivity啟動activity,主要代碼:
同樣app.thread也隻是ApplicationThread對象在ActivityManagerService的一個代理對象而已,最終會調用ApplicationThread的scheduleLaunchActivity方法。
這裡調用了queueOrSendMessage往ActivityThread的消息隊列發送了消息,消息的用途是啟動Activity,接下來ActivityThread的handler便會處理該消息。
ActivityThread的handler調用handleLaunchActivity處理啟動Activity的消息,handleLaunchActivity的主要代碼如下所示:
handleLaunchActivity方法裡有有兩個重要的函數調用,performLaunchActivity和handleResumeActivity,performLaunchActivity會調用Activity的onCreate,onStart,onResotreInstanceState方法,handleResumeActivity會調用Activity的onResume方法.
performLaunchActivity的主要代碼如下所示:
handleResumeActivity的主要代碼如下所示:
performResumeActivity的主要代碼如下所示:
Activity的概要啟動流程:
使用者在Launcher程式裡點選應用圖示時,會通知ActivityManagerService啟動應用的入口Activity,ActivityManagerService發現這個應用還未啟動,則會通知Zygote程序孵化出應用程序,然後在這個dalvik應用程序裡執行ActivityThread的main方法。應用程序接下來通知ActivityManagerService應用程序已啟動,ActivityManagerService儲存應用程序的一個代理對象,這樣ActivityManagerService可以通過這個代理對象控制應用程序,然後ActivityManagerService通知應用程序建立入口Activity的執行個體,并執行它的生命周期方法
現在也可以了解:
如果應用的元件(包括所有元件Activity,Service,ContentProvider,Receiver) 被啟動,肯定會先啟動以應用包名為程序名的程序,這些元件都會運作在應用包名為程序名的程序裡,并且是在主線程裡。應用程序啟動時會先建立Application對象,并執行Application對象的生命周期方法,然後才啟動應用的元件。
有一種情況比較特殊,那就是為元件設定了特殊的程序名,也就是說通過android:process設定程序名的情況,此時元件運作在單獨的程序内。
本文轉自 一點點征服 部落格園部落格,原文連結:http://www.cnblogs.com/ldq2016/p/6890554.html,如需轉載請自行聯系原作者