【问题标题】:How to make activity react to local Broadcasts while paused?如何在暂停时使活动对本地广播做出反应?
【发布时间】:2023-03-08 02:00:01
【问题描述】:

在活动暂停或停止时,使活动(如果有的话)对通过LocalBroadcastManager 发送的广播作出反应的最佳方法是什么。如果LocalBroadcastManager 与普通广播不同,我找不到太多细节,但如果活动在后台,似乎仍然会被称为事件。但这会导致一些问题,因为只要不显示活动,就无法进行一些 UI 修改。

这就是为什么我更愿意在活动回到顶部时处理所有广播。但我该怎么做。我正在考虑一个队列,它将获取一个可运行的列表,当活动恢复到运行状态时,这些可运行列表会被执行。但我认为这有点矫枉过正,因为 android surly 确实有这样的机制。

那么正确的方法是什么?

【问题讨论】:

  • 你的目的是什么?我的意思是,例如content providersloaders 可用于有效地更新 UI。也许还有其他方法可以解决您的问题?
  • 我正在 AsyncTask 中创建一些 X509 证书,并希望在完成后更新我的活动。
  • 应删除此问题中的 livecycle 标签。该标签用于与 Adob​​e LiveCycle ES 相关的问题。

标签: java android android-activity broadcast


【解决方案1】:

我过去所做的是让我的活动注册一个接收器 onResume 并取消注册 onPause。

创建完证书后,将更新视图和发送广播所需的任何信息保存到本地存储。

如果活动正在运行,它将接收广播并自行更新。如果它被暂停,你应该读取本地存储 onResume 并相应地更新。

【讨论】:

  • 我同意。对 Chris 来说:在这种情况下,使用服务比 AsyncTask 更好,正如 docs 所说:... AsyncTasks 理想地用于短操作(最多几秒钟)。
  • @monkybonk05:这可能是一种可行的方法,但我使用这些证书的方式,我不希望它们在我的应用程序的某个点之前一直存在于内存中。当然,我可以像您提到的那样或作为静态字段来做。这甚至似乎是 android 上的一个常见解决方案,但我不认为它是干净的代码,因为它可能导致线程问题并降低我的类的灵活性。我的活动接收到的广播是一段本地代码,不应依赖于我必须在此类之外进行的任何修改。这就是为什么我正在寻找另一种方式。
  • @Chris 如果应用程序在后台,则无法保证它会返回前台。如果操作系统需要资源,它可以从内存中删除。话虽如此,我建议您重新评估何时可以安全地保存数据
【解决方案2】:

毕竟我找到了适合我需要的解决方案。我创建了一个 BroadcastReceiver,用作我的活动的子类。每当 Activity 进入暂停状态时,它都会在我的 BroadcastReceiver 上调用 .pause()。从那时起,所有传入的 Intent 都将被放入队列中,并将在 Activity 调用 .unpause() 时刷新。

【讨论】:

  • 你在哪里注册接收器? BroadcastReceiver 中是否已经包含排队系统,还是必须自己实现?
【解决方案3】:

您为什么不简单地取消注册接收器 onDestroy?那么当activity暂停时,你仍然可以在receiver中执行代码吗?

【讨论】:

  • 根据 Android 文档,不能保证调用此方法,并且在重新启动 Activity 时可能会收到 Leaked Broadcast Receiver 异常。如果您的目标是 Honeycomb 之后的 SDK 版本,您可以在 onStop() 中取消注册接收器。如果您的目标是蜂窝设备之前的设备,则可能不会调用 onStop。
猜你喜欢
  • 2011-12-14
  • 2022-07-25
  • 2020-09-24
  • 1970-01-01
  • 2018-09-20
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
相关资源
最近更新 更多