跨进程调用service(AIDL Service)
Leatrice 创建于20160418
Android系统中,各应用程序都运行在自己的进程中,进程之间一般无法直接进行数据交换。为了实现这种跨进程通信(Interprocess communication,简称ipc),Android提供了AIDL Service。
1. 定义远程通信接口
这种接口定义的语言不是一种真正的编程语言,它只是定义两个进程的通信接口,因此语法非常简单。
里面定义了两个文件:INbSettingsService.aidl接口文件和
NbSettingsService.java服务
1) INbSettingsService.aidl
interface INbSettingsService { //定义接口
void switchCamera(); //定义方法
}
2) NbSettingsService.java
public class NbSettingsServiceextends Service{
privateNbSettingsBinder mIBinder;
publicclass NbSettingsBinder extends INbSettingsService.Stub { //实现INbSettingsService接口,也实现了IBinder接口
@Override
public void switchCamera() throwsRemoteException {
}
}
@Override
public void onCreate() {
uper.onCreate();
mIBinder = new NbSettingsBinder();
}
@Override
public IBinder onBind(Intent intent) {
returnmIBinder;
}
}
2. 注册服务和接口
在MirrorSettings的android.mk文件里添加aidl接口:
LOCAL_SRC_FILES := \
src/com/nb/forsystemui/INbSettingsService.aidl
在androidmainfest.mk里注册服务
<!-- Begin add by liting in20160418-->
<serviceandroid:name="com.nb.forsystemui.NbSettingsService" >
<intent-filter>
<actionandroid:name="com.nb.forsystemui.aidl.NBSETTINGS_SERVICES" />
</intent-filter>
</service>
<!--End add by liting in 20160418-->
3. 将接口暴露给客户端
上一步定义好AIDL接口之后,接下来就可定义一个Service实现类了,改Service的onBind()方法所返回的IBinder对象应该是ADT所生成的INbSettingsService.Stub的子类的实例。
1) 定义接口
\\frameworks\base\packages\SystemUI\src\com\nb\forsystemui
创建一个跟在服务端一样的包一样的接口INbSettingsService.aidl
2) 注册接口
在android.mk文件里添加如下:
LOCAL_SRC_FILES +=src/com/nb/forsystemui/INbSettingsService.aidl
3) 客户端绑定远程Service
a) 创建ServiceConnection对象
private ServiceConnectionsettingsConn = new ServiceConnection() {
@Override
publicvoid onServiceDisconnected(ComponentNamename) {
mSettingsService = null;
}
@Override
publicvoid onServiceConnected(ComponentNamename, IBinder service) {
//获取远程Service的onBind方法返回的对象的代理
mSettingsService=INbSettingsService.Stub.asInterface(service);
}
};
b) 以ServiceConnection对象作为参数,调用Context的bindService()方法绑定远程Service即可
Intent bindIntent = new
Intent("com.nb.forsystemui.aidl.NBSETTINGS_SERVICES");
bindIntent.setComponent(new ComponentName(
"com.android.settings","com.nb.forsystemui.NbSettingsService"));
mContext.bindService(bindIntent, settingsConn,Service.BIND_AUTO_CREATE);
c) 调用aidl方法
try{
mSettingsService.switchCamera();
}catch(Exception e){
//e.printStack();
}