上回书说到,如何使用AIDL进行线程进通信
这次我们来研究一下AIDL线程间通信原理。
Binder机制
首先我们需要知道一下什么是Binder机制,具体什么是Binder机制推荐多查一查其他博客,由于太过于偏向底层,稍微做一些了解即可。
代码分析
还是先上代码,首先看一下我们自己定义的AIDL接口
注意,一下代码均是在Android-29(Android 10.0)版本上的
interface IMyAidlInterface {
void sendMessage(in String msg);
String getMessage();
}
定义完成接口之后编辑器会自动为我们生成IMyAidlInterface.java这个类
我们使用时会在客户端绑定服务进程,在onServiceConnected中获得到IMyAidlInterface的实例对象,下面我们一起来看看代码。有关于如何绑定service以及如何拿到的实例对象请参考我的另一篇文章。
Android AMS源码分析之结合AIDL分析bindService
先看下部分关键代码及注释内容
//定义一个这个东西
private IMyAidlInterface myAidl;
public void onServiceConnected(ComponentName name, IBinder service) {
//在这里拿到它的实例
/**
*在这里我们记住传入的参数“service” 是一个Ibinder对象
*/
myAidl = IMyAidlInterface.Stub.asInterface(service);
}
然后在IMyAidlInterface中初始化
最终return的是
return new com.tiancong.myaidl1.IMyAidlInterface.Stub.Proxy(obj);
在这里我们先看一下他们的层级关系
在Proxy只有这一个构造方法,所以记住这个mRemote就是我们传入的参数
private static class Proxy implements com.tiancong.myaidl1.IMyAidlInterface
{
private android