Android AIDL使用步骤

前段时间项目中有用到AIDL,因为时间原因,没有及时记录下,今天想到这个突然感觉有点遗忘了,就又去复习了一波顺便记录下,方便下次查看,毕竟好记性不如烂笔头(滑稽)。
修改18年文章 客户端第3点缺少绑定服务代码 已在图下添加
服务端:

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

这里写图片描述

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

3.我们要在AIDL中用到这个实体类,所以需要用Parcelable序列化该实体类
这里写图片描述

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

5.然后可以再开始写的MyRemoteService.aidl里定义能被客户端调用的接口。
这里写图片描述

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



6.接下来 在java下创建一个类IBinder继承MyRemoteService.aidl对应的MyRemoteService.Stub,实现对应的方法
这里写图片描述

7.然后使用服务暴露接口给外部
创建一个服务RemoteService 继承Service,实现对应方法,
绑定MyBinder.
这里写图片描述

8.在清单文件里注册服务
这里写图片描述
注意process指定进程为远程服务,exported=true允许被其他进程调用,
action 指定一般为服务包名.aidl接口文件名;
到这里服务端的完成了。还可以添加 接下来是客户端了

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

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

这里写图片描述
上述截图 还缺少一步客户端绑定远程服务操作,可以在添加一个按钮来bind远程服务,然后就可以调用远程方法了

// 通过Intent指定服务端服务名和所在包,绑定远程服务;
//action需要和远程服务的action一致
Intent intent=new Intent("github.wzm.com.myaidl.RemoteService");
//android5.0后无法使用隐式绑定远程服务,设置指定包名
intent.setPackage("github.wzm.com.myaidl");
//绑定服务,需要传入intent和ServiceContection对象
bindService(intent,serviceConnection,Context.BIND_AUTO_CREATE);
//只后就可以调用上面截图圈出的远程方法了

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:按需调用远程接口

  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值