Android開發藝術探索筆記 第二章

第二章 IPC機制

2.1:android ipc簡介

ipc:進程中通信或者跨進程通信 (多進程通信)

簡單情況一個進程只有一個線程 即主線程 在android中可以叫做ui線程 若在ui線程中執行過多的耗時操作會造成ANR

Android中最具特色的進程間通信方式是binder,也支持Socket,

另外android在兩個應用之間進行信息傳遞 可使用ContnetProvider,也是進程間通信

2.2:android多進程模式

給四大組件指定android:process

 

2.2.1:開啓多進程: 在四大組件中設置指定 android:process  android中一個應用就存在多個進程了

設置方式 1 android:process='':remote" 和

       方式2:android:process=''com.xx.xx.remote"

方式1 是當前應用的私有進程 其他應用不可以訪問並跑在同一個進程中,並且他會自動補全默認包名成爲''com.xx.xx.remote"

方式22是屬於全局進程,其他應用可以使用Shareid方式泡在同一個進程中

Android系統會給每一個應用分配唯一的UID具有相同UID的應用纔可以共享數據,兩個應用泡在同一個進程是有要求的:

需要1:相同的ShareUID

         2簽名相同

 

2.2.2 多進程模式的運行機制

1:在一個進程中修改值只會影響當前進程中,對其他進程不會造成影響

舉個栗子:Activity1是原始進程 Activity2是新進程 1和2中都存在 public靜態變量 A 那麼在1中將A的值改變 在2中A的值則不會變

一般來說使用多進程會造成下邊幾個方面的問題

1:靜態成員和單列模式完全失效

2:線程同步機制完全失效

3:SharedPreferences 可靠性降低

4:Application多次創建

顯而易見當一個組件泡在一個新進程中的時候,系統創建新進程的時候同時分配了獨立的虛擬機,所以這個過程其實就是啓動一個應用的過程,那麼當前就會重新創建一個application,那麼就是運行在兩個不同虛擬機和application的

 

2.3:Ipc基礎概念介紹:

Serializable接口 :java中的序列化接口,使用起來開銷較大,序列化和返序列化使用大量的 io流

Parcelable接口:Android中的序列化方式,使用稍微麻煩,但是效率很高

2.3.3:Binder:

Binder是android中的一個類:無binder不android 實現了Ibinder接口

ipc角度:android中的一種跨進程通信方試

androidFramework角度上來說 是serviceManager連接各種Manager和相應的MangerService的橋樑

Android應用層:Binder是客戶端和服務端進行通信的媒介 bindService的時候,服務端返回一個服務端業務調用的binder對象

通過這個binder對象客戶端就可以獲取服務端提供的服務或者數據(普通服務,aidl服務)

根據書中的內容手擼代碼~~~~~~~

DESCRIPTOR:binder唯一標識,yibanyonghu一般用當前binder類名錶示
asInterface:用戶將服務端的binder對象轉換成客戶端所需要的AIDL接口類型的對象,這種轉化區分進程:如果客戶端和服務端在同一進程

那麼此方法返回的是服務端的stub本身,否則返回系統封裝stub.proxy對象

asBinder:返回當前的binder對象

proxy:此方法運行在客戶端當被調起時:首先創建該方法的輸入行對象Parcel_data 輸出行對象Parcel_reply

 和返回值對象List,然後調用transact方法來發起請求,然後服務期端的onTransact被調用

onTransact 這個方法在服務端的binder線程池中(

onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags)方法原型

),當客戶端發起跨進程請求時 服務端通過code確定客戶端所請求的目標方法

是什麼,接着從data中取出目標方法所含的參數,目標方發請求完畢就向reply中寫入返回值。

Binder中的兩個很重要方法LinkToDeath unlinkToDeath

Binder運行在服務端進程: 如果服務端進程由於某種原因異常終止,這個時候我們服務器端的binder鏈接斷裂,導致我們調用失敗如果我們不知道已經斷裂,那麼客戶端的功能會受影響,所以binder提供了兩個配對方法,可以設置死亡代理

2.4:Android中的IPC方式

2.4.1:使用Bundle :andoid中activity service receiver都支持在Intent中傳輸Bundler數據 Bundler實現了Parcelable接口

2.4.2使用文件共享:

兩個進程通過讀寫同一個文件交換數據,android基於Linux 讀寫可以沒有限制的進行 ,也可以兩個線程可以同時對同一個文件進行操作

2.4.3:使用Messenger

Messenger是一種輕量級的ipc方案 底層是aidl 以串行的方式進行通信 主要作用是爲了傳遞消息

Messenger中進行數據的傳遞必須將數據放入Message   Message中所傳輸的數據就是Messenger中所支持的數據傳輸類型 msg.replyTo來進行服務端迴應客戶端

2.4.3:使用AIDL

Aidl android 定義接口語言可以讓一個service與多個應用程序進行跨進程通信,從而可以實現多個應用程序共享同一個service的功能

AIDL支持的數據類型(int,long ,char,boolean,double);

String  CharSequence

LIst:只支持arraylist,裏邊每個元素也必須被AIDL支持

Map 只支持HashMap,每個元素都被AIDL支持,包括key和value

Parcelable 所有實現了Parcelable接口的對象

AIDL:所有的AIDL接口本身也可以在Aidl文件中使用

2.4.4:使用ContentProvider

Android中專門提供應用於不同進程間進行共享數據的方式 ContentProvider的底層是顯示binder但是他的使用過程要比aidl簡單

2.4.5:Socket  支持任意字節流

2.5:binder連接池 :

能夠極大地提高AIDL開發效率,並且可以避免大量的Service創建

2.5:選擇合適的ipc方式 :

è¿éåå¾çæè¿°

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章