Android — AIDL开发记录(三)
2021-02-25 本文已影响0人
许方镇
上面两篇中写了一个Service,需要注意几点:
<service android:name=".MyService">
<intent-filter>
<action android:name="com.xfz.aidlapplication.MyService123" />
</intent-filter>
</service>
-
如果服务端和客户端在一个工程中,需要设置MyService为单独进程。
android:process=":remote"
-
android:exported:代表是否能被其他应用隐式调用,其默认值是由service中有无intent-filter决定的,如果有intent-filter,默认值为true,否则为false。
-
为了不让你的服务被恶意绑定和使用,一般都要添加权限,可以先自定义一个权限,然后通过android:permission:进行设置,这是四大组件通用的。
一个Service返回多种Binder的能力
为了减少Service占用资源,应该尽量减少Service的数量,而Service的onBind方法再被绑定后会返回一个Binder,如果没有解绑,就不会再执行onBind方法了,所以即使第二次再intent中传入了不同类型的来获取新的Binder,也是不成功的。
解决的方法:Service返回一个工厂类binder,通过这个工厂类binder来生成不同的binder即可。
首先创建一个IBinderFactory.aidl
interface IBinderFactory {
IBinder generateBinder(int binderType);
}
在Binder实现类中,根据binderType返回不同的Binder,具体代码如下:
public class MyService extends Service {
public static final int TYPE_MY_BINDER = 0;
@Override
public IBinder onBind(Intent intent) {
return new BinderFactory();
}
class BinderFactory extends IBinderFactory.Stub {
@Override
public IBinder generateBinder(int binderType) throws RemoteException {
IBinder binder;
switch (binderType) {
case TYPE_MY_BINDER:
default:
binder = new MyBinder();
}
return binder;
}
}
……
}
客户端先获得BinderFactory,再获得MyBinder
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//在服务连接成功后进行调用
IBinderFactory iBinderFactory = IBinderFactory.Stub.asInterface(service);
IMyAidlInterface iMyAidlInterface = null;
try {
iMyAidlInterface = IMyAidlInterface.Stub.asInterface(iBinderFactory.generateBinder(TYPE_MY_BINDER));
} catch (RemoteException e) {
e.printStackTrace();
}
……
}