aidl使用_Binder机制第一篇——Android Studio中编写AIDL

8abcfba8717b0a5e5043a29f74ff4b6d.png

前方提示:小白篇,大牛绕道~

效果图:

408bda485dac43b4ce07b8169744f74c.gif

其实很简单,服务端有一个“败家之眼”的图片,我们要做的是:远程到服务端,然后获得服务端的图片,显示到自己的 ImageView 上边。

额~ 我们开始吧~

1、创建远程端,指定远程端的进程,确保我们的两个应用处于同一进程

让我们应用处于同一进程很简单,只需要在清单文件中设置android:process属性就可以了

但是对于 process 的属性值的命名,是有一些区别的:

* 默认,不填写,进程名称为当前项目的包名* 完整路径,比如 “com.example.lixue.aidltest” 就是完整路径; 以完整路径为名的应用可以让其他应用通过 shareUID 的方式使其共享同一进程资源 * “:”开头,比如“:remote”这种方式,那么进程名称则为“包名”+“:remote”, 比如“com.example.lixue.aidltest:remote”; 用这种方式命名的进程名,属于私有进行,其他进程不能与其共享进程资源

那么,我们这个例子是用来演示 “客户端进程” 和 “服务端进程” 相互通信的,那么最合适的就是使用第三种声明方式。

下面我在一个 project 下方创建了两个 module ,一个是默认的 app 端(当做客户端),一个是刚刚创建的 remote 端(当做被远程的服务端),并且为两者设置了不同的进程,如下图所示:

17490446706a8c8ef47533b18d59bffe.png
9288cf854e3b24f1c4214e88c4bb98f3.png

那么第一步就完工了,这只是准备工作。

2、第二步,我们需要在服务端创建并改写 AIDL 文件,Android Studio 已经为我们提供了非常方便的方式去创建 AIDL 文件,全程操作十分简洁,只需要在服务端 module 的任何位置,点击右键,选择创建 AIDL 文件即可

463d6695483ecc00cfd5ba365d7fb551.png

这个时候,就能在main的目录下看到aidl目录了,我没有对aidl文件命名,所以现在显示的是默认的aidl文件的名字,如下图

9eddbddca1bd02eedbf4d3b9ffc0d2b9.png

创建好了之后,我们接下来要对这个 AIDL 文件进行修改了,AIDL 默认给我们提供的这个方法basicTypes()一般不需要(大可直接删掉即可),我们只需要在这个IMyAidlInterface接口中添加我们想做的操作就可以了,比如我们这里就是获取 remote 端的一个图片,这个图片我们放到 remote 端的 assets 目录下,通过这个方法可以得到这个图片的 Bitmap ,然后显示到客户端的图片上。所以我们在 Aidl 文件内部添加一个getImage()方法,返回值则为 Bitmap

入下图

2e1805b89643aa1de3e7fede8f3fc167.png

3、上面两步,我们基本上没做什么事情,也就是写了一两行代码,写完之后,我们需要重新编译一下项目,得到 Android Studio 为我们自动生成的IMyAidlInterface这个接口对应的实现:Stub文件类,这是我构建完项目后生成的目录及文件

145728e149c35526aaa0fd8fb610140a.png

将视图切换到类结构会更加清晰

d119b6d0ccc8fbbbc00859315b9b6473.png

简而言之,就是经过第二步我们对 Aidl 文件的创建和修改之后,这个时候,我们编译代码,代码就会为我们生成真正的Aidl.java文件,这个文件才是实现进程间通信的关键。等于说 为了避免我们写复杂的代码实现进程间通信,google 特意在 Android Studio 中添加了创建 Aidl 的捷径,真是太 nice 了。4、接下来的工作,就是要在服务端为客户端提供远程服务service,以便于让客户端获取服务端的数据,或者调用服务端的方法。

1010335352c93c8841dfd7f0d40fbb6a.png

如有疑惑,看下注释

5、经过前面4小步,服务端就已经弄好了,接下来,只需要让客户端远程调用一下就可以了

此时,我们还得需要将 remote 服务端创建的 aidl 文件复制到我们的客户端来,如图

0681aab842c0e7382afdd058009025cb.png

然后再编译一下。编译的目的是让客户端也生成对应的adil.java文件6、编译完成之后,就可以安心的写远程服务端的代码了。

我们知道,我们可以通过开启或绑定的方式去访问另一个进程的应用,这里我们使用绑定的方式进行对 remote 服务端的访问。

由于是远程另一个应用,这里的bindService(intent)中的 intent 肯定就不能用显式的了,而是需要用隐式的,使用隐式跳转首先要保证你的 remote 服务端的清单文件对 service 有类似这样的配置

971976a5ff5bcc3834575d00c7b9ef26.png

然后准备好绑定 service 的 ServiceConnection,注意,这个部分需要在复制完 aidl 文件夹,然后构建之后才不会报错

6bc16fd7f5f3c124bebebcac6b020af2.png

然后在客户端的布局中,顶部准备了三个按钮,用来绑定及操作,中心一个 ImageView 用于显示从服务端获取的 Bitmap。

d552e541c46669b2d81aa86fbc995ea2.png
d48865bec676e40103ad429a100172fd.png

注:之所以使用子线程,是考虑到服务端的读取图片并转化成 Bitmap 可能会稍稍耗时,所以将远程服务端至于子线程

android 5.0 之后,必须按照红框中的方式进行「隐式」调用:即需要指定 service 的 action 和 package ,android 5.0 之前,可以只使用 action

7、验收成果啦先将 remote 服务端安装到设备上,然后再安装客户端,就可以看到文章顶部的效果了~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值