【Android】源码之 RemoteCallbackList

news/2024/11/7 14:37:05/

前言

最近在替换蓝牙方案商的时候,发现其在使用 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,以实现回调接口对象的注册、注销和通知。


http://www.ppmy.cn/news/634394.html

相关文章

泛型的回顾

泛型 ​ 泛型是一种安全机制&#xff0c;是一种书写的规范&#xff0c;它和接口的作用有着一定的类似&#xff0c;都是在制定规则。提升代码的复用功能&#xff0c;这里不单单对于功能模块进行一定的要求封装&#xff0c;同时也需要对数据类型进行统一的约束。 【重点】 泛型满…

我有问题请教各位硬件高手:电脑呈现这个症状是不是电源的输出功率不够?...

环境&#xff1a;华硕A7N8的主板&#xff0c;AMD1700 (OC到1500MHz),有2个硬盘&#xff0c;一个DVD RW光驱显卡声卡网卡 症状&#xff1a;有时候开机某个硬盘检测不到&#xff0c;或者停在硬盘检测画面&#xff0c;很久没有继续&#xff1b; 我的解决&#xff1a;我每次都是把硬…

YH2000—C单门禁控制器

http://sinmen001.gnway.net 第一章:YH2000—C单门禁控制器 第一节:使用操作说明 YH2000单门禁控制器由台湾高得公司出品,保修期为一年,需要使用门禁专用电源箱提供大功率的稳压DC12V,3A以下 ,直接接入普通12V电源会导致工作不正常或损坏 说明:*为退出系统编程,+为继…

年末最大规模汽车零部件采购会11日在沪开幕

12月11日&#xff0c;盖世汽车网在上海明锐大酒店举办了大规模的汽车零部件采购配对会&#xff0c;参会采购商包括GM、吉奥汽车、PSA、大宇国际、TATA东南亚公司、莲花汽车、利纳马、美国百事得等50多家&#xff0c;采购商参会规模达到2009年度之最。 在当前国内企业汽车零部件…

java程序员面试复习资料2——[JAVA基本概念]

/**作者&#xff1a;高雪峰 Email:ourjavaqq.com */ J2SE的内容&#xff1a; 第一章&#xff1a;JAVA编程基础 考点&#xff1a; 一.JAVA的基本概念 1.JAVA的基本特点 答案&#xff1a;简单&#xff0c;面向对象&#xff0c;跨平台&#xff08;可移植性&#xff09;&…

换工作的感受

换工作&#xff0c;换工作&#xff1b;只是从一个沼泽跳到另一个沼泽而已。 5月29日&#xff0c;来到30所&#xff1b;这里的环境也还不错&#xff0c;办公室两台空调&#xff0c;全新的液晶电脑&#xff0c;超宽带宽&#xff0c;纯净水供应。可惜开发模式我不是太欣赏&#xf…

CSS文字样式小结

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>首页</title><!-- 接下来演示文字样式 --><style>/*这是字符间距*/h1{letter-spacing: 2px;}h2{letter-spacing: -3px;}/*其他属性…

及时当勉励,岁月不待人--静心食粮

命由我作&#xff0c;福自己求 出自袁了凡著的《了凡四训》&#xff0c;由立命之学、改过之法、积善之方、谦德之效四部分构成。 在立命之学中讲到人的祸福、命运其实都掌握在自己的手里。《易经》上也说&#xff1a;“积善之家必有余庆&#xff0c;积不善之家必有余殃。”还说…