通常,AIDL 支持以下类型。
- Java 编程语言中的所有原语类型(如 int、long、char、boolean 等等)
- String
- CharSequence
- List
List 中的所有元素都必须是以上列表中支持的数据类型、其他 AIDL 生成的接口或您声明的可打包类型。 可选择将 List 用作“通用”类(例如,List)。另一端实际接收的具体类始终是 ArrayList,但生成的方法使用的是 List 接口。 - Map
Map 中的所有元素都必须是以上列表中支持的数据类型、其他 AIDL 生成的接口或您声明的可打包类型。 不支持通用 Map,如 Map
服务端的实现
一、编写 aidl 文件
IEasyService.aidl,文件存放在aidl文件夹中
package xj.musicserver.easy;
// Declare any non-default types here with import statements
interface IEasyService {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
void connect(String mes);
void disConnect(String mes);
}
服务端aidl文件结构.png
二、编写一个 Service,实现接口
public class EasyService extends Service {
private static final String TAG = "EasyService";
public EasyService() {
}
IEasyService.Stub mIBinder=new IEasyService.Stub() {
@Override
public void connect(String mes) throws RemoteException {
LogUtil.i(TAG,"connect: mes =" + mes);
}
@Override
public void disConnect(String mes) throws RemoteException {
LogUtil.i(TAG, "disConnect: mes =" +mes);
}
};
@Override
public IBinder onBind(Intent intent) {
LogUtil.i(TAG,"onBind: intent = "+intent.toString());
return mIBinder;
}
@Override
public boolean onUnbind(Intent intent) {
LogUtil.i(TAG,"onUnbind: =");
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
LogUtil.i(TAG,"onDestroy: =");
super.onDestroy();
}
}
三、注册AndroidManifest 文件,配置 Service 的 action 及 exported 等信息。
其中 android:exported=”true” 表示别的进程可以访问,这个是必须配置的。android:process=”:remote” 表示运行在 :remote 进程,不配置的话默认运行所在的 App 进程,这个可以不配置。
<service
android:name=".easy.EasyService"
android:enabled="true"
android:exported="true"
android:process=":remote">
<intent-filter>
<action android:name="xj.musicserver.easy.IEasyService"/>
</intent-filter>
</service>
客户端的实现
第一步:将服务端的 aidl 文件 copy 过来,注意要放在同一个包下
第二步,通过服务端 Service 的 Action 启动
当启动 Service 成功的时候,将服务端返回的 Binder 保存下来并转化成相应的实例.
(注意在 Android 5.0以后,不能通过隐式 Intent 启动 service,必须制定包名)
当我们点击按钮的时候,我们通过 Action 去启动远程 servic。
case R.id.btn_start_service:
LogUtil.i(TAG,"onButtonClick: btn_start_service=");
Intent intent = new Intent(ACTION);
// 注意在 Android 5.0以后,不能通过隐式 Intent 启动 service,必须制定包名
intent.setPackage(XJ_MUSICSERVER);
bindService(intent,mServiceConnection, Context.BIND_AUTO_CREATE);
private static final String ACTION = "xj.musicserver.easy.IEasyService";
private IEasyService mIEasyService;
ServiceConnection mServiceConnection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mIEasyService = IEasyService.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
mIEasyService=null;
}
};
第三步:与服务端通讯
通过保存下来的 Binder,即可调用服务端的方法。比如当我们点击按钮的时候,调用 connect 方法。
case R.id.btn_contact:
LogUtil.i(TAG,"onButtonClick: btn_contact=");
if(mIEasyService!=null){
mIEasyService.connect(" Cilent connect");
}
网友评论