Android AIDL管理接口队列

AIDL使用监听需要考虑多个第三方App同时添加监听,这时候需要一个队列去管理接口,一开始使用

val listenerMap = mutableMapOf<Class<*>, MutableSet<IInterface>>()

使用过程中发现添加监听没有问题,但是移除就不行了,因为多次跨进程传输客户端的对象在服务端中生成不同的对象,虽然添加和移除在客户端端中是同一个对象,但是通过AIDL传递到服务端就是两个对象,所以无法移除,但是它们底层的Binder对象是同一个,所以可以使用asBinder

        var binder = (listener as IInterface).asBinder();
        var listenerSet = listenerMap[clazz]
        listenerSet?.let {
            for (listener in it) {
                if (listener.asBinder() == binder){
                    listenerSet.remove(listener)
                }
            }
        }

或者使用RemoteCallbackList

 val listenerMap = mutableMapOf<Class<*>, RemoteCallbackList<IInterface>>()
 inline fun <reified T> addListener(listener: T, clazz: Class<T>): Int {
        listenerMap.getOrPut(clazz, { RemoteCallbackList() }).register(listener as IInterface)
        var remoteCallbackList = listenerMap[clazz]
        var num = remoteCallbackList?.beginBroadcast()
        remoteCallbackList?.finishBroadcast()
        return num?:-1;
    }
 inline fun <reified T> removeListener(listener: T, clazz: Class<T>): Int {
        var remoteCallbackList = listenerMap[clazz]
        remoteCallbackList?.unregister(listener as IInterface)
        var num = remoteCallbackList?.beginBroadcast()
        remoteCallbackList?.finishBroadcast()
        return num?:-1;
    }
    fun sendData(data: Int) {
        var remoteCallbackList = listenerMap.get(OnListener::class.java)
        remoteCallbackList?.let {
            var num = remoteCallbackList.beginBroadcast();
            for (i in 0 until num) {
                var listener = remoteCallbackList.getBroadcastItem(i) as OnListener
                if (listener!=null){
                    listener.onData(data)
                }
            }
            remoteCallbackList.finishBroadcast();
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值