Android AIDL使用步骤

前段时间项目总有用到AIDL,因为时间原因,没有及时记录下,今天想到这个突然感觉有点遗忘了,就又去复习了一波顺便记录下,方便下次查看,毕竟好记性不如烂笔头(滑稽)。

服务端:

1.在Android Studio中 src目录上右键创建一个AIDL文件 并命名,完成后会再main下自动生成一个aidl目录,该目录的包名和java下的包名是一致的。
Android AIDL使用步骤
创建完成后样式如下图所示:
Android AIDL使用步骤
每次生成的.aidl文件后我们需要build一下才能让系统生成自后我们能使用文件。因为在进程间通信中真正起作用的并不是 AIDL 文件,而是系统据此而生成的文件,在Android Studio下,我们可以在build/generated/aidl目录下找到这些Java文件。之后需要使用到当中的内部静态抽象类 Stub。
当然我们可以在所有aidl文件写完再build,也可以每次写完一个build一下。

Android AIDL使用步骤

2.我们在java对应bean目录下 生成一个实体类(AIDL没有用中到就不用写了),这里我们写一个书籍类好了
Android AIDL使用步骤

3.我们要在AIDL中用到这个实体类,所以需要用Parcelable序列化该实体类
Android AIDL使用步骤

4.接着我们要把用到的bean类在上面创建的aidl包下相同目录下创建对应实体类的aidl文件,并把它改为声明parcelable数据类型的AIDL文件
注意这里的p是小写。
Android AIDL使用步骤

5.然后可以再开始写的MyRemoteService.aidl里定义能被客户端调用的接口。
Android AIDL使用步骤

至此,我们的aidl文件写完了, 写完后我们make project或者make对应的module让漏掉的文件自动生成。

—————————————————–

6.接下来 在java下创建一个类IBinder继承MyRemoteService.aidl对应的MyRemoteService.Stub,实现对应的方法
Android AIDL使用步骤

7.然后使用服务暴露接口给外部
创建一个服务RemoteService 继承Service,实现对应方法,
绑定MyBinder.
Android AIDL使用步骤

8.在清单文件里注册服务
Android AIDL使用步骤
到这里服务端的完成了。还可以添加 接下来是客户端了

客户端:
1.新建一个工程作为客户端,我们把服务端的 的aidl整个包下所有东西都拷贝到新项目中,然后make project或者make对应的module。
Android AIDL使用步骤
2.如果aidl有用到bean实体类,我们也要把这些实体类照搬过来,
Android AIDL使用步骤

3.接下来,我们就可以在客户端的activity里连接远程服务 实现aidl通信

Android AIDL使用步骤

4.在onServiceConnected()回调中,我们使用MyRemoteService.Stub.asInterface(IBinder)方法返回我们的接口的引用。接着客户端就可以通过它来与服务端通信了。
mMyRemoteService.getBookName();
mMyRemoteService.setBookNumber(23);
图中方法中就是对远程接口的调用。

某些机型需要在服务端的开启服务才能在客户端连接成功,
所以还可以在在界面或application里启动AIDL的服务。
我测试时 华为荣耀7i(ATH-TL00H) 可以开启,而vivo V3M A 则不能开启其他进程的服务。
app被异常结束后系统重新启动persistent为true的app

添加android:persistent =“true”,使应用保活

最后,总结下 AIDL 的步骤:

服务端进程:

1:创建AIDL文件如xxx.aidl

2:在接口中自定义方法,如果有bean则实例化改bean实体类

3:构建Service远程服务

4:最后在清单文件里 注册服务,其中属性要加上export:true 让外部程序可以访问。

客户端进程:

1:将服务端的AIDL文件拷贝到main文件夹下,(如果有bean也要对应拷贝)。(包名要求与服务端的一致)

2:重建一下项目检查一下java文件是否构建成功

3:连接绑定服务,获取aidl接口实例。
4:按需调用远程接口