一,什么是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;
}