Android: 我是不是用错了BroadcastReceiver?

Android: Am I using the BroadcastReceiver wrong?

我想描述我的应用程序中的通信是如何工作的,希望有人能告诉我它是否 good/bad/just 好的设计。

我的应用是单个 Activity 多个片段。 Activity 有几个通用函数,例如 show/hide 在屏幕上显示进度条动画或显示 Snackbar。这是一个只能在一个地方实现的功能。

我的 Fragment 会在需要 Fragment 中没有的功能时发送广播。例如,如果 Fragment 想要显示 Snackbar 消息,我会发送这样的广播:

localBroadcastManager.sendBroadcast(new SnackBarIntent("Show this text"));

Activity 收到这个广播,并显示 Snackbar 消息。当然,这是单向消息。我的片段不知道广播是否收到。但总而言之,它有效。我可以从任何地方、服务、适配器等发送广播。如果需要,我还可以在片段之间发送广播。

我知道有其他选择。有一个 EventBus。或者我可以将 Activity 的引用传递给片段、适配器等。对我来说,这听起来像是一个糟糕的想法,可能会阻止正确的垃圾收集。

然后是 RxJava,我猜我的片段订阅了我从 Activity.

获得的 Observable

但是问题来了,这样使用BroadcastReceiver不好吗?如果是,为什么?

错了吗?不,它们是为这样的事情而设计的。为了提高效率,我会确保我使用的是本地广播而不是全球广播。一些替代方案可能提供更好的 API 或更多功能,但它们或多或少都做同样的事情。

我要说的是,除非广播的代码部分真的被隐藏了,否则使用接口和方法调用比使用广播更好。任何类型的事件广播的问题在于它解耦了发送者和接收者。当您需要将对象传递到多个级别或传递到不应该知道系统的那部分的地方时,这可能会有优势。但是它在维护上有缺点,特别是如果多个地方可以把相似的消息放在同一个总线上。