IPC 全稱 Inter-Process Communication 是進(jìn)程間通信,是指兩個(gè)進(jìn)程間進(jìn)行數(shù)據(jù)交換的過程。
IPC機(jī)制的使用場(chǎng)景:
- Android對(duì)單個(gè)應(yīng)用使用的最大內(nèi)存做了限制,需要獲取更多的內(nèi)存
- 當(dāng)前應(yīng)用需要向其他應(yīng)用獲取數(shù)據(jù)
開啟多進(jìn)程模式的唯一方法是在清單文件中設(shè)置 process 屬性。例如
android:process=":remote"
或
android:process="com.lzx.app.remote"
第一種是一種簡(jiǎn)寫,完整是這樣的:
android:process="com.lzx.app:remote"
第二種是一種完整的寫法,帶有 “:” 符號(hào)的屬于當(dāng)前應(yīng)用的私有進(jìn)程.
Parcelable接口:
Parcelable 接口是 Android 中實(shí)現(xiàn)序列化和反序列化的接口。并可以通過 Intent 和 Binder 傳遞。
注意 Parcelable 接口中的 Parcel 參數(shù),Parcel 是一個(gè)偏底層的東西。內(nèi)部包裝了可序列化的數(shù)據(jù),可以在 Binder 中自由傳輸。
序列化功能由 writeToParcel 方法來完成,通過 Parcel 的一系列 wirte 方法來完成的。
反序列化功能由 CREATOR 來完成,內(nèi)部表明了如何創(chuàng)建序列化對(duì)象和數(shù)組,通過 Parcel 的一系列 read 方法完成。
Binder:
Binder 非常復(fù)雜和重要,它繼承了 IBinder 接口。
從 IPC 角度看,Binder 是 Android 中一種跨進(jìn)程通信的方式。
從 Android Framework 角度看,Binder 是 ServiceManager 連接各種Manager(ActivityManager、WindowManager) 和相應(yīng) ManagerService 的橋梁。
從應(yīng)用層的角度看,Binder 是客戶端和服務(wù)端進(jìn)行通信的媒介。
在開發(fā)中,Binder 主要用在 Service,如果是普通的 Service,Binder 不涉及進(jìn)程間通信。
Android 中的 IPC 方式:
**1. Bundle **
因?yàn)?Intent 支持傳遞 Bundle 數(shù)據(jù),而且 Bundle 實(shí)現(xiàn)了 Parcelable 接口,所以可以方便的進(jìn)行進(jìn)程間傳輸。
2. 使用文件共享
使用文件要注意一個(gè)問題,就是并發(fā)讀/寫的問題,有可能讀出的內(nèi)容有可能不是最新的,并發(fā)寫的話就更嚴(yán)重,因此盡量避免并發(fā)寫這種情況的發(fā)生或者靠慮使用線程同步來限制多個(gè)線程的寫操作。
注意,SharedPreferences 是個(gè)特例,雖然它屬于文件的一種,但是系統(tǒng)對(duì)它的讀/寫有一定的緩存策略,所以在多進(jìn)程模式下,系統(tǒng)對(duì)它的讀/寫變得不可靠,當(dāng)面對(duì)高并發(fā)的讀/寫時(shí),SharedPreferences 很大幾率會(huì)丟失數(shù)據(jù)。所以,不建議在進(jìn)程間通信中使用 SharedPreferences
3. 使用Messenger
Messenger 通過它可以在不同進(jìn)程中傳遞 Message 對(duì)象。底層實(shí)現(xiàn)是 AIDL。
構(gòu)造方法:
public Messenger(Handler target){
mTarget = target.getIMessenger();
}
public Messenger(IBinder target){
mTarget = IMessenger.Stub.asInterface(target);
}
同時(shí)它一次處理一個(gè)請(qǐng)求,因此在服務(wù)端不用考慮線程同步問題。因?yàn)?Messenger 是以串行的方式處理客戶端發(fā)來的消息,如果大量消息同時(shí)發(fā)送,服務(wù)端只能一條條處理。
4. 使用AIDL
5. 使用ContentProvider
ContentProvider 是 Android 中提供的專門用于不同應(yīng)用間進(jìn)行數(shù)據(jù)共享的方式。實(shí)現(xiàn)增刪查改方法。如果要擴(kuò)展,實(shí)現(xiàn) call 方法。
6. 使用Socket
Socket 可以實(shí)現(xiàn)終端與終端之間的通信,那么它肯定可以實(shí)現(xiàn)進(jìn)程之間的通信,不過用得較少,因?yàn)樗潜容^偏網(wǎng)絡(luò)方面的。