aidl是为了让服务实现进程间通信的,使用方法跟boundService差不多,是boundService的延伸。
1.新建一个文件,以.aidl结尾,比如说IMyRemoteService.aidl,因为这个文件其实是个接口,所以命名的时候以I开头比较好。
2.然后写一些代码
package com.hyw.test;
interface IMyRemoteService{
void show();
}
包名就是该文件所在的地方,然后接口名要跟文件名一样,最后我随便定义了一个方法。
3.编译一下在gen目录下就会生成一个文件,叫IMyRemoteService.java。这样接口就算搞好了。
4.然后我们像往常搞boundService一样创建一个Service,在里面弄个MyBinder内部类通过onBind方法返回给客户端,但是在这个地方有点不一样哦。MyBinder继承的不再是Binder而是刚才弄的接口,先看代码。
package com.hyw.test;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
public class MyRemoteService extends Service {
class MyBinder extends IMyRemoteService.Stub{
@Override
public void show() throws RemoteException {
}
}
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
}
}
这个IMyRemoteService.Stub是哪来的呢?就是在gen目录下生成的IMyRemoteService.java文件里的,stub是里面的一个内部抽象类。在show方法里你就可以做一些你想做的事了,在里面执行的东西不在主线程,通过打印发现是叫Binder_2什么的线程,因为这里的执行是在另一个进程的。
5.再然后我们。。。。。,等等,别忘了注册服务,注册时候也有点不同,因为会有另外一个进程启动这个服务,所以要添加过滤器,action。
<service android:name="com.hyw.test.MyRemoteService">
<intent-filter >
<action android:name="com.hyw.test.MyRemoteService"/>
</intent-filter>
</service>
action名字随意了
6.最后,我们再创建一个项目,然后把那个aidl文件还有他的结构复制到新创建的这个项目里,也就是aidl之前是在com.hyw.test这个目录下,那么复制到新项目里也应该是在这个地方。
7.最后的最后,我们创建一个ServiceConnection回调,在绑定服务时获得binder,注意,这时候又有不同了,不能强转了,因为在这个项目里根本没那个类,这么办呢,还记得复制过来的aidl吗,同样编译之后在gen里也会出现那个java文件,我们通过stub内部类里的asInterface方法来获得MyBinder,注意看asInterface方法的参数是不是一个IBinder,没错,就是这样
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
IMyRemoteService binder = IMyRemoteService.Stub.asInterface(service);
try {
binder.show();
} catch (RemoteException e) {
e.printStackTrace();
}
}
};
最后最后。。。。。。。.。。。。。。。。。。
Intent intent = new Intent("com.hyw.test.MyRemoteService");
bindService(intent, connection, BIND_AUTO_CREATE);
game over! 隐式启动哦!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!