以下知識都是學(xué)習(xí)《Android開發(fā)藝術(shù)探索》后的總結(jié)
IPC的簡介
IPC是英文:Inter Process Communication的首字母縮寫,也就是進程間通信。
多進程的使用場景
一般的來說,當(dāng)業(yè)務(wù)需求需要多進程處理(如推送)
、分擔(dān)app內(nèi)存、或者同個公司的幾個app間需要相互通信(如某全家桶)
使用的方式和技巧
進程名以":"開頭的進程前面自動加上包名,是屬于當(dāng)前應(yīng)用的私有進程,其他應(yīng)用的組件不可以和它跑在同一個進程中。不以":”開頭的進程名屬于全局進程,以"包名.進程名"方式命名,可以通過shareUserID方式跑在同一個進程中(需要簽名相同)

在使用多進程時可能造成的問題
靜態(tài)成員和單例模式多進程間會失效(獨立的進程中會分配不同的虛擬機,內(nèi)存分配會有不同的地址,從而導(dǎo)致靜態(tài)類其實是多個不同的類)
線程同步會失效(鎖對象或者鎖全局都會因為1的理由而導(dǎo)致在多進程中失效)
sharedPreferences可靠性下降(sp是底層對xml進行讀寫,對文件并發(fā)讀寫是會出問題的(處理線程同步問題))
Application會被創(chuàng)建多次
IPC方式
Bundle
共享文件的方式共享數(shù)據(jù)
ContentProvider
Messenger
5.AIDL
- Socket
簡單的說一下使用AIDL的總結(jié)
因為Messenger的底層也是AIDL實現(xiàn)(從IMessenger.Stub.asInterface 就能很明顯地看出AIDL的痕跡),所以了解一下AIDL的機制,那么Messenger理解起來也不會太難了。
新建一個AIDL文件:

在Android Studio新建了AIDL文件后,會自動分配AIDL包(包名和androidManifest中的package 名是一樣的)。
在AIDL需要創(chuàng)建自定義類,必須實現(xiàn)可序列化的接口,有Serializable和Parcelable,Parcelable雖然實現(xiàn)起來比較復(fù)雜,在AndroidStudio 中可以安裝Parcelable的插件,自動生成代碼。因為Parcelable是Android專門序列化的接口,性能上可以提升很多。
按照上面的方法創(chuàng)建一個Book類,并實現(xiàn)Parcelable接口

因為需要在aidl中調(diào)用Book類,必須創(chuàng)建Book.aidl類,并且聲明
parcelable Book;

創(chuàng)建IBookManager后 basicTypes是自動生成的方法,要添加以下方法。
List<Book> getBookList(); void addBook(in Book book);這時候還必須手動導(dǎo)入上面的Book類,as下沒有代碼提示,也不會自動導(dǎo)入
import com.demo.abner.aidldemo.Book;

點擊Build -> Make Project

在這個路徑下會發(fā)現(xiàn)生成了IBookManager.java文件。
在這個類里有onTransact方法,以及調(diào)用了Binder接口中的transact方法
onTransact
這個方法主要是運行在服務(wù)端的Binder池中,如果返回false,客戶端會顯示請求失敗。transact()
這個方法主要是客戶端調(diào)用,是為了RPC時的數(shù)據(jù)傳遞用。
這里提到的服務(wù)端可客戶端,并不代表一定是service,只要是被請求的都是服務(wù)端,請求方都是客戶端。
RPC在android中是一種跨進程調(diào)用方式, RPC可以用自己定義的方法方式去(比如aidl的interface 方法 執(zhí)行進程通信 ,而messenger 只能用send、reply 這些類似鍵值對的。
關(guān)于介紹RPC
ContentProvider底層也是Binder,主要以表格的形式組織數(shù)據(jù)
一些注意
- 使用binder通信注意讀寫列表用CopyOnWriteArrayList,這個是支持并發(fā)的,需要用線程安全的集合。
- 監(jiān)聽使用RemoteCallbackList,在遍歷時注意beginBroadcast 和 finishBroadcast需要配對出現(xiàn)。
3.Binder死亡可以用DeathRecipient監(jiān)聽,或者在onServiceDisconnected中重連。前者在非UI線程被回調(diào),后者在UI線程被回調(diào)。
4.為了安全,使用Binder通信最好使用permission驗證
以上皆為個人初步學(xué)習(xí)時得出的結(jié)論與理解,若有錯誤或者不對之處請指出
平時比較少寫技術(shù)文章,第一次寫的還比較爛,如果有轉(zhuǎn)載請注明原作者。