IPC機(jī)制
- IPC簡(jiǎn)介
Inter-Process Communication 進(jìn)程間通信/跨進(jìn)程通信----指兩個(gè)進(jìn)程間進(jìn)行數(shù)據(jù)交換的過(guò)程莱坎。
Android中進(jìn)程間通信的方式是通過(guò)Binder方式
- Android開(kāi)啟多進(jìn)程方式
- 給四大組件在AndroidManifest中指定android:process屬性
- 通過(guò)JNI在native層fork一個(gè)新的進(jìn)程(不常用)
- 進(jìn)程名以:開(kāi)頭的進(jìn)程屬于當(dāng)前應(yīng)用的私有進(jìn)程,其他應(yīng)用的組件不可以和它跑在同一個(gè)進(jìn)程中探橱,
- 進(jìn)程名不以:開(kāi)頭的進(jìn)程屬于全局進(jìn)程瘫想,其他應(yīng)用通過(guò)ShareUID的方式可以和它跑在同一個(gè)進(jìn)程中,需要兩個(gè)應(yīng)用有相同的ShareUID和簽名,這樣他們就可以互相訪(fǎng)問(wèn)私有數(shù)據(jù)翔脱。
- 多進(jìn)程的問(wèn)題
一個(gè)靜態(tài)變量瘩扼,在不同進(jìn)程中修改它的值谆甜,不會(huì)同步到其他進(jìn)程中垃僚,每個(gè)進(jìn)程只會(huì)持有該靜態(tài)變量的副本集绰。
Android為每個(gè)應(yīng)用分配一個(gè)獨(dú)立的虛擬機(jī),或者說(shuō)每個(gè)進(jìn)程分配一個(gè)獨(dú)立的虛擬機(jī)谆棺,不同的虛擬機(jī)在內(nèi)存地址分配上有獨(dú)立的地址空間栽燕,這就會(huì)使在不同的虛擬機(jī)中訪(fǎng)問(wèn)同一個(gè)對(duì)象會(huì)產(chǎn)生多個(gè)副本
- 實(shí)現(xiàn)跨進(jìn)程通信的方式舉例:
Intent傳輸數(shù)據(jù),共享文件和sharedpreference,基于Binder的Messenger,AIDL和Socket
- 序列化Serializable中有個(gè)SerialVersionUID改淑,作用:該id被序列化到文件中碍岔,當(dāng)反序列化時(shí),會(huì)取出該id與當(dāng)前類(lèi)的id比較朵夏,如果不一樣蔼啦,表示類(lèi)中的屬性發(fā)生了變化,一般是編譯器自己通過(guò)hash計(jì)算生成仰猖,如果手動(dòng)指定捏肢,則修改類(lèi)不會(huì)報(bào)錯(cuò)。
- 靜態(tài)成員變量屬于類(lèi)饥侵,不屬于變量鸵赫,不會(huì)參與序列化
- 用transient標(biāo)記的變量不參與序列化過(guò)程
- Parcelable接口
一個(gè)類(lèi)只要實(shí)現(xiàn)該接口,就可以實(shí)現(xiàn)序列化并通過(guò)Intent和binder傳遞
- List Map也可以序列化躏升,前提是內(nèi)部元素可序列化
- Parcelable主要用在內(nèi)存序列化上
- AIDL自動(dòng)生成的java文件 p48
-
Binder的工作機(jī)制p50
- 通過(guò)給Binder設(shè)置死亡代理辩棒,linkToDeath和unLinkToDeath p60
- Messenger,基于AIDL實(shí)現(xiàn)膨疏,使用p66
- AIDL 支持的數(shù)據(jù)類(lèi)型:
- 基本數(shù)據(jù)類(lèi)型(int boolean long char double等)
- String 和 CharSequence
- List 只支持ArrayList,里面每個(gè)元素都必須被AIDL支持
- Map 只支持HashMap,里面每個(gè)元素都必須被AIDL支持一睁,包括key和value,
- Parcelable :所有實(shí)現(xiàn)了Parcelable接口的對(duì)象
- AIDL所有的AIDL接口本身也可以在AIDL文件中使用
AIDL中除了基本數(shù)據(jù)類(lèi)型外,其他數(shù)據(jù)類(lèi)型必須都標(biāo)上方向:in,out或inout,in表示輸入型參數(shù)佃却,out表示輸出型者吁,inout 表示輸入輸出型
- RemoteCallBackList 系統(tǒng)專(zhuān)門(mén)提供用于刪除跨進(jìn)程listener接口的。
底層是一個(gè)Map key為binder類(lèi)型双霍,value為listener接口類(lèi)型砚偶,原理就是listener所對(duì)應(yīng)的binder是唯一的。
- SQLiteDatabase內(nèi)部對(duì)數(shù)據(jù)庫(kù)操作是有同步處理的洒闸。但如果有多個(gè)SQLiteDatabase,則無(wú)法保證線(xiàn)程間的同步
- Binder 連接池 (p117)
大致是有多個(gè)業(yè)務(wù)Binder染坯,然后創(chuàng)建一個(gè)Binder管理的AIDL文件,用于根據(jù)類(lèi)型返回不同業(yè)務(wù)binder丘逸,然后服務(wù)端Service 只與管理Binder打交道单鹿,接收管理Binder返回的Binder,客戶(hù)端則根據(jù)管理Binder查詢(xún)自己需要的Binder再調(diào)用業(yè)務(wù)邏輯即可深纲,這樣就實(shí)現(xiàn)了簡(jiǎn)單的Binder連接池仲锄。
-
各種AIDL實(shí)現(xiàn)的優(yōu)缺點(diǎn)及使用場(chǎng)景