AIDL学习
http://blog.csdn.net/guolin_blog/article/details/9797169 这个博客写的很详细
AIDL可以实现进程间通信,bindService()调用会回调 Service的onBind()函数, return 一个 IBinder变量
一般Activity与Service之间的交互就通过这个IBinder 接口进行交互。
若是同线程的Service,之前看到的代码中是新建一个Binder类,去实现一些方法,然后将这个Binder变量return 出去。
这样Activity在ServiceConnnection 的回调方法public void onServiceConnected(ComponentName name, IBinder service) 中 会得到这个 IBinder, 将其强转之后,可以使用其暴露出来的方法。
对于不同进程之间的通信,需要用到AIDL, 首先需要定义一个AIDL文件, 新建一个interface,去定义几个方法。 ADT会自动在Gen目录下生成相同名字的.java文件。
在Service类中,我们不需要新建Binder类, 而是需要新建一个AIDL类对象, 例如 MyService.aidl
MyService.Stub myService= new Stub() { //在这里 实现aidl中声明的接口方法 }
Stub是AIDL的一个抽象接口,本身是Binder的继承。
所以在 onBinder()中将其return。
那么在onServiceConnected(ComponentName name, IBinder service)中,我们接收到的service 需要将其转为AIDL ,通过stub的asInterface()将其转换,
private MyAIDLService myAIDLService; myAIDLService =MyAIDLService.Stub.asInterface(service);
这样我们就可以使用 myAIDLService去使用其暴露的接口了。
通过我们在AIDL中定义的接口,可返回一些基本类型的数据,但是如果我们想返回一个特定的类该怎么办呢?