Android aidl은 동시에 여러 클라이언트를 서비스에 바인딩합니다.

1. 장면

최근 개발 과정에서 이러한 시나리오를 접했는데, Aidl에서 서비스와 클라이언트 간의 통신 과정에서 서비스는 동시에 통신을 위해 여러 클라이언트에 바인딩되어야 합니다.

처음에 내 생각은 이랬다.

여러 클라이언트를 바인딩하는 이 쓰기 방식에는 문제가 있습니다. 하나가 바인딩되었지만 바인딩되지 않은 경우 다른 클라이언트는 이 onBind 메서드를 사용하지 않습니다.

이는 Android의 4대 구성 요소 중 하나인 Service의 메커니즘에 의해 결정되기 때문입니다. 서비스가 bindService를 통과한 후 다시 bindService로 이동하면 onBind 콜백을 사용하지 않습니다.

둘째, 솔루션(서비스는 여러 바인더 기능을 반환할 수 있음)

Service가 차지하는 자원을 줄이기 위해서는 Service의 수를 최대한 줄여야 하며 Service의 onBind 메소드는 Bind 후 Binder를 반환하게 되며, Unbound가 아니면 onBind 메소드는 Binder를 리턴하게 된다. 다시 실행되므로 인텐트에서 두 번째로 실행되더라도 새로운 Binder를 얻기 위해 다른 유형을 전달하는 데 실패합니다.

솔루션: 서비스는 팩토리 클래스 바인더를 반환하며 이 팩토리 클래스 바인더를 통해 다른 바인더를 생성할 수 있습니다.

먼저 IBinderFactory.aidl을 생성합니다.

interface IBinderFactory {
    IBinder generateBinder(int binderType);
}

Binder 구현 클래스에서는 binderType에 따라 서로 다른 Binder가 리턴되며, 구체적인 코드는 다음과 같다.

    @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();
            }
    }

클라이언트 데모 주소: https://github.com/sunbinkang/AIDLClient/tree/t0

서버 데모 주소: https://github.com/sunbinkang/AIDLService/tree/t0

おすすめ

転載: blog.csdn.net/sunbinkang/article/details/124874522