## 9.1 四大組件的運行狀態
(1)四大組件中只有`BroadcastReceiver`既可以在AndroidManifest文件中注冊,也可以在代碼中注冊,其他三個組件都必須在AndroidManifest文件中注冊;`ContentProvider`的調用不需要借助Intent,其他三個組件都需要借助Intent。
(2)Activity是一種展示型組件,用于向用戶展示界面,可由顯式或者隱式Intent來啟動。
(3)Service是一種計算型組件,用于在后臺執行計算任務。盡管service是用于后臺執行計算的,但是它本身是運行在主線程中的,因此耗時的后臺計算仍然需要在單獨的線程中去完成。Service組件有兩種狀態:啟動狀態和綁定狀態。當service處于綁定狀態時,外界可以很方便的和service進行通信,而在啟動狀態中是不可與外界通信的。
(4)BroadcastReceiver是一種消息型組件,用于在不同的組件乃至不同的應用之間傳遞消息,它工作在系統內部。廣播有兩種注冊方式:靜態注冊和動態注冊。靜態注冊是在AndroidManifest中注冊,在應用安裝的時候會被系統解析,這種廣播不需要應用啟動就可以收到相應的廣播。動態注冊需要通過`Context.registerReceiver()`來注冊,這種廣播需要應用啟動才能注冊并接收廣播。BroadcastReceiver組件一般來說不需要停止,它也沒有停止的概念。
(5)ContentProvider是一種數據共享型組件,用于向其他組件乃至其他應用共享數據。ContentProvider中的`insert`、`delete`、`update`、`query`方法需要處理好線程同步,因為這幾個方法是在Binder線程池中被調用的,另外ContentProvider組件也不需要手動停止。
[下面對四大組件的工作過程的總結需要感謝[`amurocrash`童鞋的讀書筆記](http://blog.csdn.net/amurocrash/article/details/48858353)以及他細心制作的UML圖,幫助我從原書復雜的方法調用中跳出來看到整體的大致流程]
## 9.2 Activity的工作過程
(1)Activity啟動的大致流程

(2)`ApplicationThread`是`ActivityThread`的一個內部類,它繼承自`ApplicationThreadNative`,而`ApplicationThreadNative`繼承自`Binder`并實現了`IApplicationThread`接口,`ApplicationThreadNative`的作用其實就和系統為AIDL文件生成的類是一樣的。
(3)`ActivityManagerService`(AMS)繼承自`ActivityManagerNative`,而`ActivityManagerNative`繼承自`Binder`并實現了`IActivityManager`這個Binder接口,因此AMS也是一個Binder。
(4)一個應用只有一個Application對象,它的創建也是通過`Instrumentation`來完成的,這個過程和Activity對象的創建過程一樣,都是通過類加載器來實現的。
(5)`ContextImpl`是Context的具體實現,ContextImpl是通過Activity的`attach`方法來和Activity建立關聯的,在`attach`方法中Activity還會完成Window的創建并建立自己和Window的關聯,*這樣當window接收到外部輸入事件后就可以將事件傳遞給Activity*。?[這里可能有誤,應該是Activity將事件傳遞給window]
## 9.3 Service的工作過程
(1)Service有兩種狀態:啟動狀態和綁定狀態,兩種狀態是可以共存的。
啟動過程:

綁定過程:

## 9.4 BroadcastReceiver的工作過程
(1)BroadcastReceiver的工作過程包括廣播注冊過程、廣播發送和接收過程。
注冊過程:靜態注冊的時候是由`PackageManagerService`來完成整個注冊過程,下面是動態注冊的過程

發送和接收過程:

(2)廣播的發送有幾種類型:普通廣播、有序廣播和粘性廣播,有序廣播和粘性廣播與普通廣播相比具有不同的特性,但是發送和接收過程是類似的。
(3)一個應用處于停止狀態分為兩種情況:一是應用安裝后未運行;二是應用被手動或者其他應用強停了。從Android 3.1開始,處于停止狀態的應用無法接受到開機廣播。
##9.5 ContentProvider的工作過程
(1)當ContentProvider所在的進程啟動的時候,它會同時被啟動并被發布到AMS中,這個時候它的onCreate要先去Application的onCreate執行。
(2)ContentProvider的啟動過程:
1.當一個應用啟動時,入口方法是`ActivityThread`的`main`方法,其中創建ActivityThread的實例并創建主線程的消息隊列;
2.`ActivityThread`的`attach`方法中會遠程調用`ActivityManagerService`的`attachApplication`,并將`ApplicationThread`提供給AMS,ApplicationThread主要用于ActivityThread和AMS之間的通信;
3.`ActivityManagerService`的`attachApplication`會調用`ApplicationThread`的`bindApplication`方法,這個方法會通過`H`切換到ActivityThread中去執行,即調用`handleBindApplication`方法;
4.`handleBindApplication`方法會創建Application對象并加載ContentProvider,注意是先加載ContentProvider,然后調用Application的`onCreate`方法。
(3)ContentProvider的`android:multiprocess`屬性決定它是否是單實例,默認值是false,也就是默認是單實例。當設置為true時,每個調用者的進程中都存在一個ContentProvider對象。
(4)當調用ContentProvider的`insert`、`delete`、`update`、`query`方法中的任何一個時,如果ContentProvider所在的進程沒有啟動的話,那么就會觸發ContentProvider的創建,并伴隨著ContentProvider所在進程的啟動。下圖是ContentProvider的query操作的大致過程:

詳細的過程分析建議閱讀原書,簡直精彩!
其他學習資料
1.[Android開發藝術探索讀書筆記(三)](http://blog.csdn.net/amurocrash/article/details/48858353)
- 前言
- 讀書筆記(1)第1章 Activity的生命周期和啟動模式
- 讀書筆記(2)第2章 IPC機制
- 讀書筆記(3)第3章 View的事件體系
- 讀書筆記(4)第4章 View的工作原理
- 讀書筆記(5)第5章 理解RemoteViews
- 讀書筆記(6)第6章 Android的Drawable
- 讀書筆記(7)第7章 Android動畫深入分析
- 讀書筆記(8)第8章 理解Window和WindowManager
- 讀書筆記(9)第9章 四大組件的工作過程
- 讀書筆記(10)第10章 Android的消息機制
- 讀書筆記(11)第11章 Android的線程和線程池
- 讀書筆記(12)第12章 Bitmap的加載和Cache
- 讀書筆記(13)第13章 綜合技術