前言

这两天自己简单写了一下AIDL,发现被一个小问题搞了很久,后面发现原来是Android5.0以上的系统的一些原因,所以记录一下,方便以后注意。

AIDL简单介绍

一种Android内部进程通信接口的描述语言,可以定义进程间的通信接口。

简单使用

使用步骤

1、在Android studio 项目创建两个module。一个为服务端(aidlservice),一个为客户端(aidlclient)。

2、先进行aidlservice的实现。

  • 先创建aidl文件,定义接口,并编写相关实现方法

AIDL进程间通信

AIDL进程间通信

  • 在Build-Rebuild Project 中进行编译项目,会自动生成aidl文件。

AIDL进程间通信

  • 新建一个Service类,将aidl接口的具体实现写在Stub中,在onBind()方法中返回。

    AIDL进程间通信

  • 记得在Manifest文件中注册Service。

AIDL进程间通信

到这里已经基本上实现 aidlservice 的工作。

3、拷贝一份 aidlservice 中的aidl文件到 aidlclient 中。注意整个包拷贝过去。编译项目也会自动生成aidl文件。

AIDL进程间通信

4、aidlclient 的实现。

  • 绑定服务,设置action要和注册的service声明的action保持一致。

    AIDL进程间通信

  • 在 bindService(intent,conn, Context.BIND_AUTO_CREATE); conn为ServiceConnection接口,在其重写的onServiceConnected()方法中调用Stub.asInterface()方法。

    AIDL进程间通信

到这里,aidlclient 也完成了。看下运行结果。(先运行服务端,再运行客户端。)
在5.0系统以下的手机运行能够正常出结果。

AIDL进程间通信

AIDL进程间通信

换成5.0系统以上的手机之后就会报错:

AIDL进程间通信

报错原因大致就是说:需要显式的去启动service。

解决方法:
在bindService的时候intent.setPackage();

AIDL进程间通信

重新运行,就能正常出结果了。

AIDL进程间通信

相关文章: