LocalBroadcastManager 已被弃用。我应该用什么代替它?

LocalBroadcastManager has been deprecated. What I should use instead in its place?

我在 Android 中从事这个项目,其中一个方面需要一个带有前台服务的 CountdownTimer。 Stack Overflow 上的其他一些答案提到 LocalBroadcastManager 将适合我的需要。

但是,Android 开发人员中的文档提到它已被弃用。关于我应该用什么代替它的任何建议?文档提到了使用 LiveData,但我想知道是否有更简单的替代方法。

LocalBroadcastManager 基本上是一个 event bus with a lot of unnecessary ceremony around Intents and intent filters. So one replacement is easy, and functions quite similarly: you can use any event bus library. greenrobot's EventBus is a popular choice (here's a guide for it) and Guava also has one,如果你已经在使用 Guava(但 Guava 非常笨重,仅用于事件总线)。

但是事件总线遇到了与 LocalBroadcastManager 相同的问题,导致它被弃用:它是全局的,它不是生命周期感知的,并且随着您的应用程序变得越来越大,推断它的影响变得更加困难事件的改变。对于观察数据的情况,LiveData 很好地解决了这个问题,因为它是生命周期感知的,所以你不会在错误的时间收到更改通知(比如在你的视图设置之前,或者在 onSaveInstanceState 之后) - 但当您再次处于正确状态时,它会处理发送更改通知。它的范围也更严格——LiveData 的每一部分都是单独访问的,而不是(通常)整个应用程序只有一个事件 bus/LocalBroadcastManager。

对于更像是一个事件而不是一段数据被更改的情况,您有时可以将其转换为一段数据。考虑一下如果您有 "login" 和 "logout" 事件 - 您可以创建一个 LiveData 来存储登录用户的帐户,并在用户注销时变为空。然后组件可以观察到。

在某些情况下,确实很难将其转换为一段可观察数据(尽管我无法立即想到通常会与事件总线模式一起使用的任何示例)。对于这些,请考虑编写自己的侦听器界面,类似于点击侦听器的工作方式。

对于您的倒数计时器示例,我认为 LiveData 是一个非常简单的解决方案,并且比事件总线甚至 LocalBroadcastManager 都容易得多。您可以只拥有计时器当前值的 LiveData,并从任何需要显示该值的地方订阅它。