天天看點

深入了解Activity啟動流程(三)–Activity啟動的詳細流程2

本系列部落格将詳細闡述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循環,不斷地讀取消息隊列裡的消息,并分發消息。

深入了解Activity啟動流程(三)–Activity啟動的詳細流程2

在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便會處理該消息。

深入了解Activity啟動流程(三)–Activity啟動的詳細流程2

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,如需轉載請自行聯系原作者

繼續閱讀