logo头像
Snippet 博客主题

aidl的使用心得(一)

本文于 896 天之前发表,文中内容可能已经过时。

什么是AIDL?

  • AIDL是指IPC(Internal progress Communicate)直译为进程间通信,在Android端就是指通俗的指两个APP之间通信。本人认为就是本地引用远程服务,即在客户端(本地)引用服务端(远程)的服务。

AIDL应用场景

  1. 就如他的定义一样,一般用于两个APP之间通信,虽然可以用进程间通信可以用全局广播,但由于广播安全性低,且所有APP都能收到。尤其是有序广播,其可以被拦截特性,顾采用AIDL方式进行通信。
  2. 一般来说就是支付宝支付,这种就需要使用AIDL方式,确保支持返回成功。

贴图支付宝

AIDL使用

为了方便管理分为3个模块

包含内容

一、服务端**(APP)**

  1. 定义Service服务,并写好服务中与变量的交互

二、客户端**(APP)**

  1. 引用包含Aidl Module的aar文件
  2. 绑定对应服务

三、AIDL Module**(Lib)**

  1. aidl文件夹:包括对应的aidl接口和传输的对象
  2. 常量文件,一般包含服务端的服务的action和packageName,确保能够正常引用
  3. 用于生成aar文件,方便引用

步骤

AIDL Module

  1. 创建Aidl的Module包
    创建Module

  2. 创建Aidl文件
    其中包含定义接口传递的对象

创建aidl1

创建aidl2

包含的文档

注意:

  • 传递的对象不仅在aidl目录下有,也需要在对应java目录下存在,并且必须实现Parcelable接口
  • aidl文件中需要自己全部手写,没有自动提示
  • 传递对象的aidl文件需要import对应类所在的位置,以确保能够被找到
  1. buid Module,确保自动生成java对应的接口文件

传递的类文件

  1. 确定服务端APP的报名和服务的action名,写入常量中
1
2
3
4
5
6
7
8
/**
* 此处定义服务的相关常量,以确保在客户端时能够具体找到。具体为在aidlserver的Mainifest中写的内容
*/
public class BaseConstant {
public static final String ACTION = "com.minicoder.peopleservice";
public static final String PACKAGENAME = "com.minicoder.aidlserver";
}

服务端**(APP)**###

  1. 引用Aidl Moudle
    implementation project(path: ‘:aidllib’)
  2. 定义Service,注意在manifest中设置action名称,定义一个内部类Binder继承Stub,并实现对应aidl中定义的相关方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

public class PersonService extends Service {

private Common mComm = Common.getInstance();

@Override
public IBinder onBind(Intent intent) {
return new PersonBinder();
}

/**
* 此处实现aidl自动生成的Stub类
*/
private class PersonBinder extends IChatAidl.Stub {

@Override
public Person getPerson() throws RemoteException {
Person controller = mComm.getController();
return controller;
}

@Override
public int addPerson(Person p) throws RemoteException {
List<Person> personList = mComm.getPersons();
boolean success = personList.add(p);
return success ? personList.size() - 1 : -1;
}
}
}

1
2
3
4
5
6
7

<service android:name=".PersonService" >
<intent-filter>
<action android:name="com.minicoder.peopleservice"/>
</intent-filter>
</service>

客户端**(APP)**###

  1. 引用Aidl Moudle
  2. 绑定服务
  3. 使用Stub.asInterface(service),将其转化为对应接口
  4. 调用接口中的方法
    注意:

  • 此处获取的对象,不是服务端中的对象,所以在此处更改对象里面的值服务端不会更新,客户端只能将需要修改的值传入然后在服务端的binder中再进行修改

源码下载地址

演示demo

包含的文档