AIDL(跨进程通信传输语言)的用法

    (简介) 应用A的Activity通过AIDL实现与应用B的service进行交互(案例:A应用

的Activity去调用B应用的Service 实现A应用显示时间)

常用的与service交互的方法有三种:
1.start的方式与service交互

Activity是不能直接与service进行交互,
需要借助于其他组件来完成,常见的就是利用广播接收器
service发送广播,Activity接收广播

2.bind的方式与service交互

需要在service中准备一个IBinder接口的实现类,将该实
现类的对象作为onBind方法的返回值
在Activity中需要一个serviceConnection对象,它会有
两个回调的方法,在onServiceConnectioned方法中获得service
内onBind方法的返回的IBinder对象,通过IBinder来实现
与Service的交互

3.Aidl的方式与Service交互

bind方式进行交互是有个前提,Activity和service是处于同一个App
中(同一进程中),通过AIDL可以实现跨进程的调用
一个App的Activity可以调用另一个App中的Service方法
进行AIDL跨进程调用,必须使用Service的一个.aidl描述文件才可以进行

详细步骤为:

1.在包中新建“File”文件。文件名为"MyBinder.aidl"
里面内容如下:

package com.example.serviceprovider;

 interface MyBinder {
 String getTime();

}

//类似接口但没有public修饰
 
2.在提供服务的App中添加Service子类,重写onBind方法
返回新建的IBinder对象的返回值,新建的实现类继承aidl
中接口。系统自动在后面添加.stub后缀(在Java文件中,

 实现 AIDL中定义的接口. 编译器会根据AIDL接口, 产生一个JAVA接口。

这个接口有一个名为Stub的内部抽象类,它继承扩展  了接口并实现了

远程调 用需要的几个方法(是Binder的子类),然后重写的方法返回
service中已经写好的方法(getServiceTime):

AIDL(跨进程通信传输语言)的用法_第1张图片

3.再新建一个安卓应用A,在src文件夹下新建一个包,包名与MyBindder.aidl文件中的包名一致,然后将aidl文件导入到该包下

4.在新建应用的显示界面添加一个TextView和两个Button按钮,当点击第一个按钮时启动B服务,获得B应用的服务时间并实现每过一秒钟刷新一次时间,点击第二个按钮停止B服务,具体的代码如下:

AIDL(跨进程通信传输语言)的用法_第2张图片AIDL(跨进程通信传输语言)的用法_第3张图片

注意:A应用在启动B应用的服务时,由于两个应用不是同一应用,所以不能通过显示意图启动,只能在B应用的清单配置文件的Service中添加隐式意图,在A应用中通过B应用的隐式意图启动

你可能感兴趣的:(AIDL,应用)