什么是aidl:aidl是 Android Interface definition language的缩写,
它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口
实现步骤:
1.创建一个MyServiceDemo工程,删掉layout(这个服务不需要layout布局),在manifest中注册MyService,写好service中要公开的服务,我以公开play(),pause()为例
<service
android:name="com.example.ex_bindserviceserver.MyService"
android:enabled="true"
android:exported="true" >
<intent-filter >
<action android:name="com.april.ACTION_BIND"/> <!-- 在Activity bindService的时候使用-->
</intent-filter>
</service>
2.在MyServiceDemo工程中创建MyService.aidl进程通信接口文件,拷贝到ActivityDemo工程中去,这两个工程的中aidl包名和文件必须相同。
package com.example.aidl;
interface MyService {
void play();
void pause();
}
3.service端就做完了,现在就是在ActivityDemo调用远程的Service
告诉你怎么在客户端如何调用服务端得aidl描述的接口对象,doc只告诉我们需要实现Service.onBind(Intent)方法,该方法会返回一个IBinder对象到客户端
public void btnBind(View v)
{
bindService(new Intent("com.april.ACTION_BIND"), conn, BIND_AUTO_CREATE);
}
注:其中com.april.ACTION_BIND是MyServiceDemo的manifest.xml中我们自己定义好的。
绑定服务时不是需要一个ServiceConnection对象么,在没有了解aidl用法前一直不知道它是什么作用,其实他就是用来在客户端绑定service时接收service返回的IBinder对象的:
ServiceConnection conn=new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName arg0) {
// TODO Auto-generated method stub
}
@Override
public void onServiceConnected(ComponentName arg0, IBinder service) {
myService=MyService.Stub.asInterface(service);
}
};
mService就是AIDLService对象,具体可以看我后面提供的示例代码,需要注意在客户端需要存一个服务端实现了的aidl接口描述文件
,但是客户端只是使用该aidl接口,不需要实现它的Stub类,获取服务端得aidl对象后mService = AIDLService.Stub.asInterface(service);
,就可以在客户端使用它了,对mService对象方法的调用不是在客户端执行,而是在服务端执行