AIDL使用跨进程调用全实现

  • Post author:
  • Post category:其他


写了不下五次了,这次全记录!


AIDL使用起来其实很简单,一个服务端,一个客户端。

服务端顾名思义,就是提供服务的。客户端通过绑定service获取连接,获取到binder对象应用之后,可以用来调用服务端实现的一些方法。

而AIDL文件相当于两者的协议书,服务端和客户端必须都有,才能支持客户端访问服务端。

如下整体思路就是(如果看不懂可以直接跳过看后面的实操过程):

  1. 新建服务端项目
  2. 服务端新建AIDL文件
  3. 然后在AIDL文件中新增一些自定义方法
  4. 运行项目或者make project,目的是编译生成与.aidl文件对应的.java文件
  5. 在服务中继承AIDL的Stub类,实现其对应方法(自定义和默认方法)
  6. 然后在服务类的onBind方法中,创建此实现类的对象传递给绑定发起者,也就是客户端
  7. 新建客户端项目
  8. 将服务端main目录下的AIDL文件夹拷贝到客户端的main目录下
  9. 运行项目或者make project,目的是编译生成与.aidl文件对应的.java文件
  10. 客户单发起服务绑定,跨进程连接服务端的服务。绑定服务时,传入的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对象:

在这里插入图片描述

细节上可能有问题,大家如果有发现问题,还请提出来。多谢!



版权声明:本文为m0_38101382原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。