上一篇《Android进程通信一之AIDL》
说到进程A---->B拿去数据,那问题来了,B进程如果有了数据更新,如何回调给A啊?
这篇文章就来聊聊这个
原理
声明一个 AIDL 接口,然后在服务端所实现的 AIDL 接口中通过注册和注销来添加和删除声明的 AIDL 接口。然后在服务端需要发消息给客户端的时候遍历所有已注册的接口来发起通信,这就是为什么说AIDL可以一对多通信。
第一步
声明AIDL文件,并新增接口方法
// IMyAidlInterface.aidl
package com.ly.aidltest;
import com.ly.aidltest.Student;
import com.ly.aidltest.IReceive;
// Declare any non-default types here with import statements
/**除了默认的基本类型,就是下面直接生成出来的方法自带的这6种类型不需要import之外,其他的都需要手动import
* 其他类型包括下面几种:
*List 接口(会自动将List接口转为 ArrayList),且集合的每个元素都必须要么是基本类型,要么是Parcelable实现类
*Map 接口(会自动将 Map 接口转为 HashMap),且每个元素的 key 和 value 要么是基本类型,要么是Parcelable实现类
*Parcelable 的实现类
*AIDL 接口本身
*/
interface IMyAidlInterface {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
double aDouble, String aString);
//定义两个方法,也就是提供给客户端的服务
List<Student> getStudent();
//这里的in 是有讲究的
void addStudent(in Student stu);
void registerListener(IReceive listener);
void unregisterListener(IReceive listener);
}
第二步
服务端注册回调,并发送数据
public class MyService extends Service {
private List<Student> list = new ArrayList<>();
aidl 接口专用容器
private RemoteCallbackList<IReceive>callbackList = new RemoteCallbackList<>();
private static final String TAG = "MyService"