九、四大組件的工作過程

1.四大組件的運行狀態

Android中的四大組件除了BroadcastReceiver之外,其他三大組件都必須在Manifest裏面註冊,對於BroadcastReceiver來說,它既可以在Manifest裏面註冊,也可以通過代碼來註冊。
在調用方式上面,Activity,Service,BroadcastReceiver需要藉助Intent,而ContentProvider則無需藉助Intent。

Activity是一種展示型組件,用於向用戶直接地展示一個界面,並且可以接收用戶的輸入信息從而進行交互。

Service是一種計算型組件,用於在後臺執行一系列計算任務。Service有兩種狀態,啓動狀態和綁定狀態。當處於啓動狀態的時候,Service內部可以做一些後臺計算,而且不需要和外界有直接的交互。當處於綁定狀態的時候,Service內部同樣可以做一些後臺計算,但是處於這種狀態時外界可以很方便地和Service組件進行通信。
注意:儘管Service組件是執行後臺計算的,但是它本身是運行在主線程中的,因此耗時的後臺計算仍然需要在單獨的線程中去完成。

BroadcastReceiver是一種消息型組件,用於在不同的組件乃至不同的應用之間傳遞消息。由於BroadcastReceiver的特性,它不適合用來執行耗時操作,BroadcastReceiver組件一般來說不需要停止,也沒有停止的概念。

ContentProvider是一種數據共享型組件,用於向其他組件乃至其他應用共享數據。它的內部需要實現增刪改查這四種操作,在它的內部維持着一份數據集合,這一個數據集合既可以通過數據庫來實現,也可以採用其他任何類型來實現,比如List和Map,ContentProvider對數據集合的具體實現並沒有任何要求。
注意: ContentProvider內部的insert,delete,update,query方法需要處理好線程同步,因爲這幾個方法是在Binder線程池中被調用的,另外ContentProvider也不需要手動停止。

2.Activity的工作過程

Activity真正的啓動是調用ActivityManagerService的startActivity方法。
AMS中轉移到ActivityStackSupervisor的startActivityMayWait方法。
Activity的啓動在ActivityStackSupervisor與ActivityStack之間的傳遞順序
Activity的啓動在ActivityStackSupervisor與ActivityStack之間的傳遞順序

最終由ApplicationThread的scheduleLaunchActivity方法來啓動Activity。發送一個啓動Activity的消息交給Handler處理,Handler的名字叫H。

最終Activity的啓動過程由ActivityThread的handleLaunchActivity方法實現,最後調用performLaunchActivity方法。

    private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) {
        ...
        if (localLOGV) Slog.v(
            TAG, "Handling launch of " + r);
        // Initialize before creating the activity
        WindowManagerGlobal.initialize();
        Activity a = performLaunchActivity(r, customIntent);
        if (a != null) {
            r.createdConfig = new Configuration(mConfiguration);
            Bundle oldState = r.state;
            handleResumeActivity(r.token, false, r.isForward,
                    !r.activity.mFinished && !r.startsNotResumed);
        ...
        }
    ...
    }

通過handleResumeActivity方法來調用被啓動Activity的onResume這一生命週期方法。

performLaunchActivity方法主要完成了以下幾件事:
2.1.從ActivityClientRecord中獲取待啓動的Activity組件信息;
2.2.通過Instrumentation的newActivity方法使用類加載器創建Activity對象;
2.3.通過LoadedApk的makeApplication方法來嘗試創建Application對象;
2.4.創建ContextImpl對象並通過Activity的attach方法來完成一些重要數據的初始化;
2.5.調用Activity的onCreate方法.

3.Service的工作過程

Service分爲兩種工作狀態,一種是啓動狀態,主要是用於執行後臺計算,另一種
是綁定狀態,主要用於和其他組件和Service的交互。需要注意的是,Service的
這兩種狀態是可以共存的,即Service既可以處於啓動狀態,也可以同時處於綁定
狀態。
3.1.Service的啓動過程
3.2.Service的綁定過程

4. BroadcastReceiver的工作過程

4.1.廣播的註冊過程
廣播的註冊分爲靜態註冊和動態註冊,其中靜態註冊的廣播在應用安裝時由系統自動完成註冊,具體來說是由PMS(PackageManagerService)來完成整個註冊過程的,除了廣播之外,其他三大組件也都是在應用安裝時由PMS解析並註冊的。
4.2.廣播的發送和接收過程

5.ContentProvider的工作過程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章