一.IPC簡介
1.IPC:是Inter-Process Communication的縮寫,含義為進程間通信或者跨進程通信,是指兩個進程之間進行數據交換的過程。
2.線程:是CPU調度的最小單元,同時線程是一種有限的系統資源
3.進程:是指一個執行單元,在PC和移動設備上是指一個程序或者一個應用,一個進程可以包含多個線程,因此進程和線程是包含與被包含的關系。
4.Android里面的主線程,也稱為UI線程,在UI線程里才能操作界面元素,一個進程需要執行大量的耗時任務,這些耗時任務如果放在主線程中去執行,嚴重影響用戶體驗,還可能造成應用無響應(ANR),解決這個問題就需要用到線程,把一些耗時的任務單獨放到子線程中執行。
5.ANR:Application Not Responding,ANR一般有三種類型:
(1). KeyDispatchTimeout(5 seconds) --主要類型按鍵或觸摸事件在5秒內無響應
(2). BroadcastTimeout(10 seconds) --BroadcastReceiver在10秒內無法處理完成
(3). ServiceTimeout(20 seconds) --小概率類型 Service在20秒內無法處理完成
6.IPC的使用場景:只有面對多進程時,才需要考慮進程間通信,多進程的情況分為兩種:
(1).一個應用因為某些原因自身需要采用多進程模式來實現,比如:有些模塊需要運行在單獨的進程中,又或者是為了增大一個應用可使用的內存所以需要多進程來獲取多份內存空間。
(2).一個應用需要向其它應用獲取數據,由于是兩個應用,所以必須采用跨進程的方式來獲取所需的數據,比如:通過ContentProvider對通訊錄的增刪改查。
二.Android中的多進程模式
1.Android中的多進程是指一個應用中存在多個進程的,在Android中使用多進程的方法有且只有一種:就是給四大組件(Activity,Service,Receiver,ContentProvider),在AndroidManifest中指定android:process屬性,Android默認進程名是包名。
2.process屬性的定義分為兩種
(1).android:process="com.xxx.xxxx.remote" 完整的命名方式,屬于全局進程,其它應用通過ShareUID方式可以和它跑在同一個進程中。
(2).android:process=":remote",進程以“:”開頭的進程屬于當前應用的私有進程,其它應用的組件不可以和它跑在同一個進程中,“:”命名的進程會在當前的進程名之前附加上包名如:“com.xxx.xxxx:remote”。
3.UID:Android系統會為每個應用分配一個唯一的UID,具有相同UID的應用才能共享數據。如果兩個應用通過ShareUID跑在同一個進程中,需要兩個應用具有相同的shareUID并且相同的簽名才可以。
4.多進程帶來的問題
(1).靜態成員和單例模式完全失效
(2).線程同步機制完全失效
(3).SharedPreference的可靠性下降
(4).Application會多次創建
所以說:運行在不同進程中的四大組件,只要他們之間通過內存來共享數據,都會失敗。正常情況下四大組件共享數據必須要通過一些中間層。系統提供了很多跨進程通信的方法:(Intent傳遞數據,文件共享,Messenger,AIDL,ContentProvider,Socket等)。
后續會詳細分析各種跨進程通信的方式,請持續關注;