2013-02-21 41 views
3

当活动暂停或停止时,对通过LocalBroadcastManager发送的广播做出的活动(如果有的话)的最佳方式是什么?如果LocalBroadcastManager与普通广播不同,我无法找到更多详细信息,但如果活动处于后台,似乎仍然被称为事件。但是这会导致一些问题,因为只要未显示活动,一些UI修改就不可行。如何让活动在暂停时对本地广播做出反应?

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

那么最好的方法来做到这一点?

+0

你的目的是什么?我的意思是例如[内容提供商](http://developer.android.com/guide/topics/providers/content-providers.html)和[加载器](http://developer.android.com/reference/android/ content/Loader.html)可以用来有效地更新UI。也许还有其他方法可以解决你的问题? – 2013-02-21 23:36:30

+0

我在AsyncTask中创建了一些X509证书,并且想要在完成时更新我的​​活动。 – Chris 2013-02-22 13:27:56

+0

应删除此问题的活动周期标记。该标签用于与Adobe LiveCycle ES相关的问题。 – 2013-02-22 15:23:02

回答

2

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

完成创建证书后,保存到本地存储器,无论您需要什么信息来更新视图并发送广播。

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

+1

我同意。对Chris来说:在这种情况下使用服务比'AsyncTask'好,因为[docs](http://developer.android.com/reference/android/os/AsyncTask.html)说:* ... AsyncTasks should理想情况下用于短期操作(最多几秒钟)。* – 2013-02-22 19:30:15

+0

@ monkybonk05:这将是一种可行的方法,但我使用这些证书的方式,我不希望它们在持久内存中,直到在我的应用程序的某些点。当然,我可以像你提到的那样做,或者作为一个静态领域。这甚至似乎是一个在android上的常见解决方案,但我不认为它是干净的代码,因为它可能导致线程问题,并且会导致我的类的灵活性。我的活动收到的广播是一个本地代码,不应该依赖于我必须在本课之外进行的任何修改。这就是为什么我正在寻找另一种方式。 – Chris 2013-02-22 23:24:11

+0

@Chris如果应用程序在后台,则不能保证它会返回到前台。如果操作系统需要资源,则可能会将其从内存中移除。话虽如此,我建议您重新评估何时可以安全地保存您的数据。 – Mike 2013-02-25 13:16:08

-1

你为什么不简单地注销接收器onDestroy?所以,虽然活动暂停,你仍然可以在接收器中执行代码?

+1

根据Android文档,此方法不保证被调用,并且您可能会在重新启动活动时收到泄漏广播接收器异常。如果您在Honeycomb之后定位SDK版本,则可以在onStop()中取消注册接收器。如果您的目标是预蜂窝设备,那么onStop可能不会被调用。 – 2013-07-30 20:34:37

1

毕竟我找到了适合我需求的解决方案。我创建了一个用作我的活动的子类的BroadcastReceiver。只要活动进入暂停状态,它就会在我的BroadcastReceiver上调用.pause()。从这一点开始,所有传入的意图都被放入一个队列中,并且将在对该活动的.unpause()的调用中刷新。

+2

你在哪里注册接收器?排队系统是否已经包含在'BroadcastReceiver'中,还是你必须自己实现? – 2014-07-17 09:39:32