Android 使用Aidl 一个app绑定或启动另一个app的服务并获取服务里的数据

**

Android 使用Aidl 一个app绑定或启动另一个app的服务并获取服务里的数据

**

最近有网友问我,Android 里使用Aidl 怎么让一个app绑定或启动另一个app的服务并获取服务里的数据。我当时想这个涉及的东西好深哟,Android系统的进程通信了,很复杂的东西了。问我会不会做?这个需求我没有遇到过更没做过,我当时想,我曾经做过一个app调用另一个app contentProvider里的数据,service,contentprovider都是Android的四大组件,又都是在一个手机里,基于我对Android系统的理解,我就告诉他,应该是可以的,毕竟Service里还有一个Binder 对象啊,可以和系统交互的。为了验证这一理论分析,我做一个demo。

1、需要新建两个app,假设是客户端app和服务端app。
客户端app
新建一个MyService,注册时要注意action的赋值。

Android 使用Aidl 一个app绑定或启动另一个app的服务并获取服务里的数据
Android 使用Aidl 一个app绑定或启动另一个app的服务并获取服务里的数据
Android 使用Aidl 一个app绑定或启动另一个app的服务并获取服务里的数据

在MyService里创建一个Binder类,先新建一个.aidl类。
在工程的main文件夹里新建一个aidl文件夹,然后再aidl文件夹里新建一个IMyAidlInterface.aidl类。
Android 使用Aidl 一个app绑定或启动另一个app的服务并获取服务里的数据
Android 使用Aidl 一个app绑定或启动另一个app的服务并获取服务里的数据

Android 使用Aidl 一个app绑定或启动另一个app的服务并获取服务里的数据
Android 使用Aidl 一个app绑定或启动另一个app的服务并获取服务里的数据

创建完aidl后要build工程
Android 使用Aidl 一个app绑定或启动另一个app的服务并获取服务里的数据
Android 使用Aidl 一个app绑定或启动另一个app的服务并获取服务里的数据
Android 使用Aidl 一个app绑定或启动另一个app的服务并获取服务里的数据
Android 使用Aidl 一个app绑定或启动另一个app的服务并获取服务里的数据
Android 使用Aidl 一个app绑定或启动另一个app的服务并获取服务里的数据
IMyAidlInterface.Stub 返回一个Binder,在onBind方法里将这个binder传给绑定者。

到这里客户端app的工作就结束了,上一张完整截图
Android 使用Aidl 一个app绑定或启动另一个app的服务并获取服务里的数据

服务端app
将客户端app的aidl文件夹复制到服务端app里的main文件夹里
Android 使用Aidl 一个app绑定或启动另一个app的服务并获取服务里的数据
然后app文件夹里的build.gradle里添加aidl.srcDirs=[‘src/main/aidl’],然后build一下工程,这个和客户端操作一样。
Android 使用Aidl 一个app绑定或启动另一个app的服务并获取服务里的数据
接下在MainActivity里添加两个Button,一个是绑定服务,一个是获取数据。
Android 使用Aidl 一个app绑定或启动另一个app的服务并获取服务里的数据

Android 使用Aidl 一个app绑定或启动另一个app的服务并获取服务里的数据
Android 使用Aidl 一个app绑定或启动另一个app的服务并获取服务里的数据
绑定时action要和MyService 注册时的action一致,Intent要有显示的。
到这里服务端app的工作也完成了

2、将两个app运行到手机上,测试是否可以绑定和获取数据。
Android 使用Aidl 一个app绑定或启动另一个app的服务并获取服务里的数据
Android 使用Aidl 一个app绑定或启动另一个app的服务并获取服务里的数据
先点击绑定服务按钮,客户端app的打印执行了onCreat和onBind,说明MyService被绑定了,点击获取数据按钮,服务端app打印获取到的数据;客户端app打印了onDestory,解绑成功。
启动服务就更简单了,这套代码稍作调整就可以了,不做演示了。

测试成功!

如果需要代码,加我QQ:792686722