Android — AIDL开发记录(三)

2021-02-25  本文已影响0人  许方镇

上面两篇中写了一个Service,需要注意几点:

        <service android:name=".MyService">
            <intent-filter>
                <action android:name="com.xfz.aidlapplication.MyService123" />
            </intent-filter>
        </service>

一个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();
            }
……
    }

上一篇 下一篇

猜你喜欢

热点阅读