Android 學(xué)習(xí)IPC之個人總結(jié)

以下知識都是學(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方式跑在同一個進程中(需要簽名相同)

進程使用方式

在使用多進程時可能造成的問題

  1. 靜態(tài)成員和單例模式多進程間會失效(獨立的進程中會分配不同的虛擬機,內(nèi)存分配會有不同的地址,從而導(dǎo)致靜態(tài)類其實是多個不同的類)

  2. 線程同步會失效(鎖對象或者鎖全局都會因為1的理由而導(dǎo)致在多進程中失效)

  3. sharedPreferences可靠性下降(sp是底層對xml進行讀寫,對文件并發(fā)讀寫是會出問題的(處理線程同步問題))

  4. Application會被創(chuàng)建多次

IPC方式


  1. Bundle

  2. 共享文件的方式共享數(shù)據(jù)

  3. ContentProvider

  4. Messenger

5.AIDL

  1. Socket

簡單的說一下使用AIDL的總結(jié)

因為Messenger的底層也是AIDL實現(xiàn)(從IMessenger.Stub.asInterface 就能很明顯地看出AIDL的痕跡),所以了解一下AIDL的機制,那么Messenger理解起來也不會太難了。

新建一個AIDL文件:


新建AIDL文件.png

在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接口


創(chuàng)建Book類.png

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

創(chuàng)建Book.aidl.png

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

創(chuàng)建IBookManager接口.png

點擊Build -> Make Project

IBookManager.java文件.png

在這個路徑下會發(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ù)

一些注意

  1. 使用binder通信注意讀寫列表用CopyOnWriteArrayList,這個是支持并發(fā)的,需要用線程安全的集合。
  2. 監(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)載請注明原作者。

我的Github
我的微博

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容