【Android】源码之 RemoteCallbackList

RemoteCallbackList是Android用于跨进程通信的工具,管理回调接口的注册、注销和通知。它在系统服务和组件中广泛应用,如通知服务和媒体播放。通过实现Binder服务或AIDL接口,可以使用RemoteCallbackList进行回调管理,确保线程安全和并发操作的正确性。
摘要由CSDN通过智能技术生成

前言

最近在替换蓝牙方案商的时候,发现其在使用 RemoteCallbackList 进行回调。于是抱着学习的心态来看看这个类吧。

在 Android 中,RemoteCallbackList 类是一个用于跨进程通信的工具类,可以用来注册、注销和通知客户端的回调接口。它在 Android 系统中广泛应用于各种系统服务和框架组件中,如通知服务、Activity 生命周期回调、媒体播放器等等。

什么是 RemoteCallbackList

RemoteCallbackList 是一个类似于列表的数据结构,它用于存储回调接口对象。每个回调接口对象都有一个唯一的 Binder 标识符,可以用来在不同进程之间进行传递和跟踪。RemoteCallbackList 的主要功能是提供了一组安全的 API,使得客户端可以注册、注销和通知回调接口对象,同时还提供了一些线程安全的方法,保证了并发操作的正确性。

RemoteCallbackList 的使用

在使用 RemoteCallbackList 时,我们通常需要实现一个 Binder 服务或者一个 AIDL 接口,并在其中创建一个 RemoteCallbackList 对象。这个对象会被用来存储客户端注册的回调接口对象。

以下是 RemoteCallbackList 的常用方法:

register(T callback):注册一个回调接口对象。
unregister(T callback):注销一个回调接口对象。
beginBroadcast():开始通知客户端,返回客户端数量。
getBroadcastItem(int index):获取指定位置的回调接口对象。
finishBroadcast():通知客户端结束。

以下是一个简单的例子:

public class MyBinder extends Binder {
    private RemoteCallbackList<MyCallback> mCallbacks = new RemoteCallbackList<>();

    public void registerCallback(MyCallback callback) {
        mCallbacks.register(callback);
    }

    public void unregisterCallback(MyCallback callback) {
        mCallbacks.unregister(callback);
    }

    public void notifyCallbacks(String message) {
        int count = mCallbacks.beginBroadcast();
        for (int i = 0; i < count; i++) {
            try {
                mCallbacks.getBroadcastItem(i).onMessageReceived(message);
            } catch (RemoteException e) {
                // do nothing
            }
        }
        mCallbacks.finishBroadcast();
    }
}

在上面的例子中,我们创建了一个名为 MyBinder 的 Binder 服务,并在其中使用了 RemoteCallbackList 来实现注册、注销和通知回调接口对象。当客户端调用 registerCallback 方法时,会将回调接口对象添加到 RemoteCallbackList 中;当客户端调用 unregisterCallback 方法时,会将回调接口对象从 RemoteCallbackList 中移除;当服务端需要通知客户端时,会调用 notifyCallbacks 方法,遍历 RemoteCallbackList 中所有的回调接口对象,并调用其相应的方法,实现回调的功能。

RemoteCallbackList 的线程安全性

由于 RemoteCallbackList 可能会被多个线程同时访问,因此其线程安全性非常重要。RemoteCallbackList 内部使用了一些同步机制,保证了其并发操作的正确性。

具体来说,RemoteCallbackList 内部维护了两个不同的列表:一个是注册的回调接口列表,另一个是正在通知的回调接口列表。当客户端注册或注销回调接口对象时,会先获取锁,然后将操作同步到注册的回调接口列表中。而当服务端需要通知客户端时,也会获取锁,然后将正在通知的回调接口列表设置为注册的回调接口列表的副本,以确保通知期间注册和注销回调接口对象不会影响到正在通知的列表。

此外,RemoteCallbackList 还提供了一些线程安全的方法,如 beginBroadcast、getBroadcastItem 和 finishBroadcast,这些方法在操作期间会获取锁,保证了并发操作的正确性。
总结

RemoteCallbackList 类是 Android 框架中的一个重要工具类,用于跨进程通信中的回调接口处理。它提供了一组安全的 API,使得客户端可以注册、注销和通知回调接口对象,并提供了一些线程安全的方法,保证了并发操作的正确性。在实际开发中,我们通常需要在 Binder 服务或者 AIDL 接口中使用 RemoteCallbackList,以实现回调接口对象的注册、注销和通知。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
RemoteCallbackListAndroid框架中的一个类,用于管理回调接口对象。它提供了注册、注销和通知回调接口对象的功能。当客户端需要与服务端进行通信并接收回调时,可以使用RemoteCallbackList来管理回调接口对象。 以下是RemoteCallbackList的一些特点和用法: 1. RemoteCallbackList是线程安全的,可以在多线程环境下使用。 2. 当客户端调用registerCallback方法时,会将回调接口对象添加到RemoteCallbackList中。 3. 当客户端调用unregisterCallback方法时,会将回调接口对象从RemoteCallbackList中移除。 4. 当服务端需要通知客户端时,可以调用notifyCallbacks方法,遍历RemoteCallbackList中所有的回调接口对象,并调用其相应的方法,实现回调的功能。 以下是一个使用RemoteCallbackList的示例代码: ```java // 创建一个RemoteCallbackList对象 RemoteCallbackList<MyCallback> callbackList = new RemoteCallbackList<>(); // 客户端注册回调接口对象 MyCallback callback = new MyCallback(); callbackList.register(callback); // 服务端通知客户端 int count = callbackList.beginBroadcast(); for (int i = 0; i < count; i++) { MyCallback callback = callbackList.getBroadcastItem(i); callback.onCallback(); } callbackList.finishBroadcast(); // 客户端注销回调接口对象 callbackList.unregister(callback); ``` 请注意,上述示例中的MyCallback是一个自定义的回调接口,你需要根据实际需求来定义和实现该接口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凉亭下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值