Android — AIDL开发记录(三)

上面两篇中写了一个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();
            }
……
    }

你可能感兴趣的:(Android — AIDL开发记录(三))