【问题标题】:Android: How to update the UI from a static BroadcastReceiver?Android:如何从静态 BroadcastReceiver 更新 UI?
【发布时间】:2018-02-10 04:21:05
【问题描述】:

经过大量搜索后,我仍然找不到解决问题的方法:

我需要一个每天运行一次的广播,无论应用程序是否正在运行。但是,如果应用程序正在运行,我还需要在广播结束/之后更新 UI。

我无法使用以编程方式注册的广播,因为它以应用生命周期结束。但是从静态清单注册的广播中,我无法访问 UI(至少我不知道如何)。 一种选择是拥有 2 个不同的广播并在 onPause 和 onResume 中取消/启动它们,但我想知道是否有更简单的解决方案?

【问题讨论】:

  • 你不能每天运行一次Service,而不是BroadcastReceiver吗?
  • 哎呀,我还没有研究服务,因为我是一个初学者,我被告知广播是我正在寻找的。我会立即查找服务。
  • 并检查bound services
  • 看看here。否则 - 如前所述 - 看看服务。您可以绑定到服务以交换数据(查看@pskink 的答案)
  • 您尝试注册到哪个广播意图?对于版本 O,Android 限制显式广播。您可能想在此处查看后台执行限制developer.android.com/guide/components/…

标签: android broadcast


【解决方案1】:

您需要的不是broadcast receiver 以及AlarmManagerJobScheduler 用于21 以上的api 和greenrobot 事件总线。

AlarmManager 每天或在您想要的任何时间安排一次广播调用,并且每次调用广播时,您都可以从 eventbus 触发事件并在您想要的地方接收该事件。使用事件总线的原因是我们不需要处理视图是否可见。如果视图处于重用状态,它会触发事件视图,并且事件总线调用一个方法,在该方法中你可以用视图做任何你想做的事情。

我个人不喜欢服务,因为现在执行服务真的很昂贵。

注意:您放置警报管理器和广播的包名称 接收器应该“提醒”一些三星手机非常优化,所以 他们只会让包名带有“警告完全运行”。你 还需要在boot receiver 上注册接收器和日程安排 手机开机时的报警管理器。

【讨论】:

  • 谢谢,似乎是一个很好的解决方案。关于您的注释:您的意思是,关键字“alert”必须在我的整个应用程序的包名称中(您在一开始就设置),我只是在一个底层文件夹中?
  • 这不是官方解决方案,但我遇到了 s7 edge 的问题。并发现它正在工作。上下文与您的不同,但相似。没有包含用于视图更改的警报管理器和广播接收器的包应该是单独的包,称为“警报”。最好将 bootcomplete 接收器保留在包的根目录中。
  • 谢谢。但是,如果 Receiver 是 MainActivity 中的内部类,我会怎么做?我应该将整个 MainActivity 放入警报文件夹吗?
  • 分离模块好。并将接收器放在单独的模块中。
  • 谢谢。如果我从 BroadcastReceiver 切换到 Service,三星手机会不会出现类似的问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多