由淺入深理解Activity的誕生


近來回顧了一下關於Activity的生命週期,參看了相關書籍和官方文檔,也有了不小的收穫,對於以前的認知有了很大程度上的改善,在這裏和大家分享一下。

總所周知,Activity的生命週期(onCreate,onStart,onResume,onPause,onStop,onRestart,onDestroy)

 

上圖是經典的activity生命週期圖,相信不少朋友也都看過。

簡單的說,在一個activity創建的時候生命週期順序onCreate->onStart->onResume,在activity關閉的時候onPause->onStop->onDestroy。當處於棧頂的activity(當前可見的activity),打開新的activity的時候,新的activity透明或部分遮擋當前activity,執行onPause(),完全遮擋執行onStop。而打開新的activity不是瞬間覆蓋當前activity,而是具有動畫效果的漸入,所以先執行onPause再onStop。

知道了Activity的生命週期,那麼Activity是怎麼執行onCreate的呢?

進入Activity的onCreate方法中看到

<span style="font-family:Microsoft YaHei;color:#333333;"> protected void onCreate(@Nullable Bundle savedInstanceState) {
        if (DEBUG_LIFECYCLE) Slog.v(TAG, "onCreate " + this + ": " + savedInstanceState);
        if (mLastNonConfigurationInstances != null) {
            mAllLoaderManagers = mLastNonConfigurationInstances.loaders;
        }
        if (mActivityInfo.parentActivityName != null) {
            if (mActionBar == null) {
                mEnableDefaultActionBarUp = true;
            } else {
                mActionBar.setDefaultDisplayHomeAsUpEnabled(true);
            }
        }
        if (savedInstanceState != null) {
            Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
            mFragments.restoreAllState(p, mLastNonConfigurationInstances != null
                    ? mLastNonConfigurationInstances.fragments : null);
        }
        mFragments.dispatchCreate();
        getApplication().dispatchActivityCreated(this, savedInstanceState);
        if (mVoiceInteractor != null) {
            mVoiceInteractor.attachActivity(this);
        }
        mCalled = true;
    }</span>


看到關鍵地方getApplication().dispatchActivityCreated(this, savedInstanceState);

再來看Application的dispatchActivityCreated方法

<span style="font-family:Microsoft YaHei;color:#333333;">  /* package */ void dispatchActivityCreated(Activity activity, Bundle savedInstanceState) {
        Object[] callbacks = collectActivityLifecycleCallbacks();
        if (callbacks != null) {
            for (int i=0; i<callbacks.length; i++) {
                ((ActivityLifecycleCallbacks)callbacks[i]).onActivityCreated(activity,
                        savedInstanceState);
            }
        }
    }</span>

 

<span style="font-family:Microsoft YaHei;color:#333333;">  public interface ActivityLifecycleCallbacks {
        void onActivityCreated(Activity activity, Bundle savedInstanceState);
        void onActivityStarted(Activity activity);
        void onActivityResumed(Activity activity);
        void onActivityPaused(Activity activity);
        void onActivityStopped(Activity activity);
        void onActivitySaveInstanceState(Activity activity, Bundle outState);
        void onActivityDestroyed(Activity activity);
    }</span>

 

從上面代碼可以看出,Activity的創建是後於Application的onCreate。也就是說onCreate(Application)->onCreate(Activity),而dispatchActivityCreated是作爲管理Activity的存在。

那麼疑問又來了,Application又是什麼時候執行的呢?

這時,我們需要了解AMS----ActivityManagerService,ActivityThread,ApplicationThread三個類。

 

ActivityManagerService.java  簡稱爲 AMS 功能有:管理所有應用程序的Activity 、內存管理等 。

       路徑位於: \frameworks\base\services\java\com\android\server\am\ActivityManagerService.java

       說明:該類是一個Binder類,即可實現跨進程通信。因此可以接受從客戶端,例如Instrumentation、Context等調用過來的

           信息。ActivityManagerService提供了全局的代理對象,供IPC調用。

 

ActivityThread.java    路徑位於:\frameworks\base\core\java\android\app\ActivityThread.java

         說明: 該類爲應用程序(即APK包)所對應進程(一個進程裏可能有多個應用程序)的主線程類,即我們通常所說的UI線程。

           一個ActivityThread類對應於一個進程。最重要的是,每個應用程序的入口是該類中的static main()函數 。

 ApplicationThread類是ActivityThread的內部類:

       說明:該類是一個Binder類,即可實現跨進程通信。主要用於接受從AMS傳遞過來的消息,繼而做相應處理。

AMS與ActivityThread的通信模型圖如下:

 

 

從該模型圖我們得知以下知識點:

 

       第一、 引起調用AMS的對象通常有Context 、 Instrumentatio、ActivityThread等 。

       第二、當AMS接受到來自某個應用程序傳來的消息後,在AMS內部處理完畢後,會通過Binder機制回調回該應用程序

             所在ApplicationThread服務端類,即ActivityThread.java類。

       第三、當ActivityThread接受到AMS傳遞過來的消息後,進行內部處理。如果需要的話,會繼續與AMS通信。

       最後,當整個通信完成時,ActivityThread會選擇合適的對象,例如Service、Activity、BroadcastReceiver等去做相應的

            處理。

 

 

最後我們需要知道,AcitityThread接收到AMS的是什麼消息,以及接收到消息之後,會怎麼做?

 

在整個系統中,Activity實際上有兩個實體。一個在應用進程中跟應用程序員打交道的Activity,一個是在AMS的中具有管理功能的History Record。應用進程中的Activity都登記ActivityThread實例中的mActivity數組中,而在AM端,HistroytRecord實例放置在mHistroy棧中。mHistory棧是Android管理Activity的場所,放置在棧頂的就是User看到的處於活動狀態的Activity。

Activity與HistrotyRecord的關係圖可以表示如下:

image_thumb6

       Activity的內核實體是依靠在ProcessRecord的成員變量中,通過ProcessRecord我們可以訪問到所有的屬於該Process的Activity。而在ProcessRecord記錄了與應用進程之間的聯繫:IActivtityThread接口。通過該接口,可以訪問到所對應的Activity的方法。在Launch Activity時,AMS將對應的HistoryRecord作爲token傳遞到客服端和客服端的Activity建立聯繫。在AMS中Activity狀態變化時,將通過該聯繫找到客服端的Activity,從而將消息或者動作傳遞應用程序面對的接口:xxxActivity。

1)發起請求startActivity(intent)

2)Activity Service Manager接收到請求執行StartActivity函數。

      建立:HistoryRecord實例r.

      將r 加入到mHistory頂。

(3)通過app.thread.scheduleLaunchActvity( app,r)@ActivityThread.java

(4)在App應用中建立新的ActivityRecord。

(5)建立新的Activity對象並放入到ActivityRecord中。

(6)將ActivityRecord加入到mActivites@ActivityThread

(7)發起Activity.onCreate(..),,該onCreate就是在你的應用程序XXXActivity中的onCreate。

  image_thumb10

 

 

部分內容轉自:

Android中ActivityManagerService與應用程序(客戶端)通信模型分析

Android應用框架之Activity

 

總結:Activity的誕生:  startActivity->ActivityManagerService->HistoryRecord->ApplicationThread->ActivityThread->onCreate(Activity)

本文僅供學習和參考,如有錯誤請指出,謝謝。轉載請註明出處

發佈了29 篇原創文章 · 獲贊 14 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章