前言
这两天自己简单写了一下AIDL,发现被一个小问题搞了很久,后面发现原来是Android5.0以上的系统的一些原因,所以记录一下,方便以后注意。
AIDL简单介绍
一种Android内部进程通信接口的描述语言,可以定义进程间的通信接口。
简单使用
使用步骤
1、在Android studio 项目创建两个module。一个为服务端(aidlservice),一个为客户端(aidlclient)。
2、先进行aidlservice的实现。
- 先创建aidl文件,定义接口,并编写相关实现方法
- 在Build-Rebuild Project 中进行编译项目,会自动生成aidl文件。
新建一个Service类,将aidl接口的具体实现写在Stub中,在onBind()方法中返回。
记得在Manifest文件中注册Service。
到这里已经基本上实现 aidlservice 的工作。
3、拷贝一份 aidlservice 中的aidl文件到 aidlclient 中。注意整个包拷贝过去。编译项目也会自动生成aidl文件。
4、aidlclient 的实现。
绑定服务,设置action要和注册的service声明的action保持一致。
在 bindService(intent,conn, Context.BIND_AUTO_CREATE); conn为ServiceConnection接口,在其重写的onServiceConnected()方法中调用Stub.asInterface()方法。
到这里,aidlclient 也完成了。看下运行结果。(先运行服务端,再运行客户端。)
在5.0系统以下的手机运行能够正常出结果。
换成5.0系统以上的手机之后就会报错:
报错原因大致就是说:需要显式的去启动service。
解决方法:
在bindService的时候intent.setPackage();
重新运行,就能正常出结果了。