写了不下五次了,这次全记录!
AIDL使用起来其实很简单,一个服务端,一个客户端。
服务端顾名思义,就是提供服务的。客户端通过绑定service获取连接,获取到binder对象应用之后,可以用来调用服务端实现的一些方法。
而AIDL文件相当于两者的协议书,服务端和客户端必须都有,才能支持客户端访问服务端。
如下整体思路就是(如果看不懂可以直接跳过看后面的实操过程):
- 新建服务端项目
- 服务端新建AIDL文件
- 然后在AIDL文件中新增一些自定义方法
- 运行项目或者make project,目的是编译生成与.aidl文件对应的.java文件
- 在服务中继承AIDL的Stub类,实现其对应方法(自定义和默认方法)
- 然后在服务类的onBind方法中,创建此实现类的对象传递给绑定发起者,也就是客户端
- 新建客户端项目
- 将服务端main目录下的AIDL文件夹拷贝到客户端的main目录下
- 运行项目或者make project,目的是编译生成与.aidl文件对应的.java文件
- 客户单发起服务绑定,跨进程连接服务端的服务。绑定服务时,传入的ServiceConnection会有回调onServiceConnected(),在此方法中会将服务端的IBinder对象传过来,然后我们可以使用此对象调用服务端的实现方法
下面开始实际操作:
新建一个安卓项目,然后在main目录下新建AIDL文件:
建成后的效果如下:
然后打开IMyAidlInterface.aidl,如下:
新增自己的方法:
好了,AIDL文件创建完毕,注意,getName就是我们自定义的方法,或者可以说是提供给客户端调用的方法。
接下来执行make project,目的是编译生成与AIDL文件对应的java文件:
有时间的话重点关注其如下实现:
此处是向远程服务发起调用并返回结果。在客户端调用mRemote.transact之后,对端(服务端)会调用onTransact。具体的代码逻辑不再具体解析。
继续流程。
此处与aidl文件对应的java文件生成后,在android project中新建服务类,在类中继承IMyAidlInterface.Stub。如下:
大概意思就是,客户端绑定服务,并获取远程binder对象引用,然后就可以调用远程方法。
注意要对相关的重写方法进行实现。
并且,四大组件都要在AndroidManifest.xml中进行注册,别忘了注册MyService并且将exported设置为true。
服务端完成,我们接下来完成客户端。
新建项目后,将“协议文件”拷贝过来。
执行make project或者运行项目,同样会生成如下文件:
这样的话,客户端和服务端都有了一份aidl文件,并且对应的java文件已经生成。
接下来,我们在客户端尝试连接服务端,获取binder对象:
细节上可能有问题,大家如果有发现问题,还请提出来。多谢!