Android进程间通信可以参考android-进程间通信
这里着重介绍一下AIDL。
这里只是记录一下我自己的实现过程,例子本身不重要,重要的是知道怎么做。。。
总体来说分三步:创建AIDL,创建服务端,创建客户端。
一、创建AIDL
1.在java目录下创建一个包名com.ps.sevenaidldemo.aidl(随便取),然后创建Book.java实体类,这个实体类必须实现Parcelable接口,用于序列化和反序列化。
2.新建aidl文件夹,跟java同级别,然后在这个文件夹下创建跟实体类同名的aidl文件及其他aidl接口文件。
3.Rebuild项目,生成Binder的java接口文件。
我在Rebuild时,出现如下错误:
这是因为导入的包名不对。
将包名改为:package com.ps.sevenaidldemo.aidl;
相应的,IBookManager.aidl,和 OnNewBookAddListener.aidl中也需要将包名改正确。
另外,IBookManager.aidl 和 OnNewBookAddListener.aidl中用到了Book类,虽然在同一包下,但是还是需要导入,这里只能手动导入。
确保需要的包全部导入正确,然后就可以Rebuild通过了,这样就生成了Binder的java接口文件。
二、创建服务端(Service)
创建Service,在onBind方法中返回Binder实例对象,并实现aidl接口方法。
服务端是Service的典型实现,以上需要注意的点:
在onBind方法中,最好添加访问权限的判断,防止一些恶意的访问,可使用 Permission 验证,在 manifest 中声明。
创建Binder 对象时,不能使用new Binder ()的方式,必须使用new IBookManager.Stub()创建Binder对象,这是AIDL接口文件自动生成的Binder对象。
服务是四大组件之一,需要在清单文件中注册
三、创建客户端
绑定远程服务后,通过ServiceConnection得到代理对象Binder,同时将Binder对象转换成AIDL接口,然后通过AIDL接口去调用服务端的方法。
注意:
通过以上操作就可以实现AIDL功能了,运行后结果如下:
2019-03-21 16:33:21.853 11024-11024/com.ps.sevenaidldemo E/MainActivity: 连接服务成功
2019-03-21 16:33:23.854 11024-11037/com.ps.sevenaidldemo E/MainActivity: onNewBookAdd: Book{bookName='新书1'}
2019-03-21 16:33:25.858 11024-11038/com.ps.sevenaidldemo E/MainActivity: onNewBookAdd: Book{bookName='新书2'}
2019-03-21 16:33:27.858 11024-11037/com.ps.sevenaidldemo E/MainActivity: onNewBookAdd: Book{bookName='新书3'}
2019-03-21 16:33:29.859 11024-11038/com.ps.sevenaidldemo E/MainActivity: onNewBookAdd: Book{bookName='新书4'}
2019-03-21 16:33:31.860 11024-11037/com.ps.sevenaidldemo E/MainActivity: onNewBookAdd: Book{bookName='新书5'}
2019-03-21 16:33:31.864 11024-11038/com.ps.sevenaidldemo E/MainActivity: onAllBook: [Book{bookName='遮天'}, Book{bookName='斗破苍穹'}, Book{bookName='坏蛋是怎样炼成的'}, Book{bookName='新书1'}, Book{bookName='新书2'}, Book{bookName='新书3'}, Book{bookName='新书4'}, Book{bookName='新书5'}]
通过以上三步操作,就实现了AIDL。