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(){ @Overridepublic 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 自定义类名;