您的位置:首页 > 移动开发 > Android开发

Android Activity与Service的AIDL接口通讯

2016-07-23 21:07 477 查看
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 = newServiceCallback.Stub{
……………………
4.在Service中实现
private ServiceCallback callback;

private final CallService proxy = new CallService.Stub(){
@Override
   public void registerCallback(ServiceCallback callback) throws RemoteException {
callback = callback;
}
@Override
	public 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 自定义类名;

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息