一、AIDL服务简介
Android系统中,各应用程序都运行在自己的进程中,进程之间一般无法直接进行数据交换,我们可以通过AIDL实现跨进程调用Service。
当客户端访问service时,远程Service会通过onBInd()方法将IBinder对象的代理返回给客户端(具体是返回到客户端ServiceConnection的onServiceConnected方法的第二个参数)。当客户端获取了远程Service的IBinder对象的代理之后,就可以通过IBinder对象去回调远程Service的属性和方法了。
二、AIDL服务端
1、创建AIDL文件
AIDL只是定义两个进程之间的通信接口,其语法与java接口很相似。但存在如下几点差异:
- AIDL定义接口的源代码必须以.aidl结尾。
- AIDL接口中用到的数据类型,除了基本类型、String、List、Map、CharSequence之外,其他类型全部都需要导包,即使他们在同一个包中也需要导包。
定义一个AIDL接口:
// IUser.aidl
package com.example1.test.aidl;
// Declare any non-default types here with import statements
interface IUser {
String getName();
int getId();
}
定义好上面的AIDL接口之后,ADT工具在该接口所在包的目录下生成一个IUser.java接口,在该接口里包含一个Stub内部类,该内部类实现了IBinder、IUser两个接口,这个Stub类将会作为远程Service的回调类——它实现了IBinder接口,因此可以作为Service的onBinder()方法的返回值。
2、将接口暴露给客户端—Service实现类
Service实现类,其中的onBInd()方法返回的IUer.Stub的实例,供其它应用程序的调用并获取service的信息。
public class AIDLService extends Service{
private String name;//用户姓名
private int id;//用户id
public IUser.Stub userBinder=new IUser.Stub() {
@Override
public String getName()