IPC 進(jìn)程間通信機(jī)制

一,什么是IPC
IPC:inter-process communication,進(jìn)程間通信或者跨進(jìn)程通信。window通過(guò)剪貼板,管道等進(jìn)行進(jìn)程間通信。Linux通過(guò)命名管道,共享內(nèi)存,信號(hào)量等進(jìn)行進(jìn)程間通信。android有特色的是Binder。在android進(jìn)程通信可以有以下方式:aidl,socket通信,使用Bundle,使用contentprovider,使用Messenger,使用文件共享
二 binder 機(jī)制
我們知道,在Android app中的眾多activity,service等組件可以運(yùn)行在同一進(jìn)程中,也可以運(yùn)行在不同進(jìn)程中。當(dāng)組件運(yùn)行在同一進(jìn)程中進(jìn)行通信就顯得比較簡(jiǎn)單,在之前的Android線程間通信機(jī)制中已經(jīng)講過(guò)了;而當(dāng)它們運(yùn)行在不同的進(jìn)程 中時(shí),就需要使用我們本文中所要介紹的Binder機(jī)制了。
Binder作為一種進(jìn)程間通信機(jī)制,負(fù)責(zé)提供遠(yuǎn)程調(diào)用的功能(RPC),它的系統(tǒng)組件主要包括四種:Client, Server, ServiceManager, Binder Driver. 它們之間的關(guān)系如下圖所示

從圖中我們可以看出,Client, Server, ServiceManager運(yùn)行在系統(tǒng)的用戶態(tài),而B(niǎo)inder Driver運(yùn)行在內(nèi)核態(tài)。為了完成Client端到Server端的通信任務(wù),用戶空間的需要操作Binder Driver提供的/dev/binder文件來(lái)完成交互。那么ServiceManager的工作是什么呢?ServiceManager負(fù)責(zé)管理Server并向Client端提供一個(gè)Server的代理接口(proxy)。通過(guò)代理接口中定義的方法,Client端就可以使用Server端提供的服務(wù)了。整個(gè)過(guò)程如下:
Client端調(diào)用代理接口的方法,將Client的參數(shù)打包為parcel對(duì)象發(fā)送給內(nèi)核空間中BinderDriver;
Server端讀取到BinderDriver中的請(qǐng)求數(shù)據(jù),將parcel對(duì)象解包并處理;
處理好后,將處理結(jié)果打包返回給BinderDriver,再交給Client端。
另外,Client端與Server端的調(diào)用過(guò)程是同步的,即在Server返回結(jié)果之前,Client端是阻塞的。調(diào)用過(guò)程如下所示:

AIDL 例子
首先定義一個(gè)AIDL 文件,名字ICalculateAidlInterface.aidl , 定義兩個(gè)方法,重新rebuild下工廠,則生成對(duì)應(yīng)的Java文件,Java文件位于/build/generated/source/aidl/debug/包名/

interface ICalculateAidlInterface {     
    int add(int a,int b);    
    int minus(int a,int b);
}

然后新建一個(gè)CalculateService 繼承Service 做服務(wù)端 ,順便打印Service 生命周期

@Overridepublic void onCreate() {   
     Log.e(TAG,"onCreate");    
     super.onCreate();
}
@Overridepublic void onStart(Intent intent, int startId) {
      Log.e(TAG,"onStart");    
      super.onStart(intent, startId);
}
@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {
    Log.e(TAG,"onStartCommand");    
     return super.onStartCommand(intent, flags, startId);
}
@Overridepublic void onDestroy() {   
      Log.e(TAG,"onDestroy");    
      super.onDestroy();
}
@Overridepublic boolean onUnbind(Intent intent) {    
    Log.e(TAG,"onUnbind");    
    return super.onUnbind(intent);
 }
@Overridepublic void onRebind(Intent intent) {    
    Log.e(TAG,"onRebind");    
    super.onRebind(intent);
}
@Nullable@Overridepublic IBinder onBind(Intent intent) {   
   Log.e(TAG,"onBind");    return mBinder;
}

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

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

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