Android Activity与Service的AIDL接口通讯

来源:互联网 发布:淘宝客定向计划公开 编辑:程序博客网 时间:2024/06/07 06:14

Android 中Activity与Service通信方式有很多种,其中AIDL是我比较偏爱的一种通讯方式。今天就在此处介绍一下AIDL接口的使用和主意事项。

首先介绍一下AIDL:Android Interface Definition Language,即Android接口定义语言。解决Android的进程间通信的主要且优异方法。在这里主要介绍使用方法、参数传递和自定义类型的使用。

一、使用方法

1.创建两个AIDL接口文件一个用作UI调用Service另一个用于Service回调UI;例如:CallService.aidl     ServiceCallback.aidl

2.在CallService中声明如下两个方法:

void registerCallback(ServiceCallback callback);   用于UI注册ServiceCallback    void unRegisterCallback(ServiceCallback callback); 用语UI注销ServiceCallback
3.在UI(Activity)中分别实现ServiceCallback的接口功能
例如在Acitivity中使用ServiceConnection初始化通信接口:
serviceConn = new ServiceConnection() {    @Override    public void onServiceConnected(ComponentName name, IBinder service) {        callService = CallService.Stub.asInterface(service);        try {            callService.registerCallback(callback);        } catch (RemoteException e) {            Log.error(e);            Toast.makeText(MainActivity.this, e.toString(), Toast.LENGTH_SHORT).show();            return;        }    }    @Override    public void onServiceDisconnected(ComponentName name) {        try {            callService.unRegisterCallback(callback);        } catch (final RemoteException e) {            Log.error(e);            Toast.makeText(MainActivity.this, e.toString(),Toast.LENGTH_SHORT).show();            return;        }    }};
接下来实现ServiceCallback功能
ServiceCallback callback = new ServiceCallback.Stub{
……………………
4.在Service中实现
private ServiceCallback callback;

private final CallService proxy = new CallService.Stub(){    @Override
   public void registerCallback(ServiceCallback callback) throws RemoteException {      callback = callback;      }@Overridepublic void unRegisterCallback(ServiceCallback callback) throws RemoteException {    if(callback == callback ){        callback = null;    }}
    和其它方法
}
@Override    public IBinder onBind(Intent intent) {         return proxy.asBinder();    }
参数传递主意事项
AIDL可以传递java原生数据类型int long String 等
AIDL可以传递集合类的如List和Map,但是集合中的数据必须是原生数据类型或自定义的序列化的类型
AID传递自定类型需注意必须序列化,序列化后还要在AIDL包下穿件一个生命文件,文件名与自定义类型的名称一致,路径名也要与自定义类型的文件所在路径名称一致,内容
package x.x.x; parcelable 自定义类名; 

0 0
原创粉丝点击