3

我有一项服务,可以从 Internet 下载一些数据并定期向指标活动发送进度。在处理服务结束时发送结果。

我有一个问题,什么是实现通信持久性的最佳方式。

  • Messenger 或 ResultReceiver,我需要将它们打包成 Intent 并在服务中存储侦听器列表。但是在配置更改时活动会破坏,并且很难维护此列表。

  • LocalBroadcastManager,我需要从 Messages 迁移到 Intents,而且这个类中没有粘性发送。因此,如果我在我的进度活动处于后台时获得结果,结果将丢失。

  • BroadcastManager 很好,但我不需要在系统范围内广播我的进度和安全问题。

有任何想法吗?

4

4 回答 4

2

您可能想试试Otto ( http://square.github.io/otto/ )。

在您的服务中,只要您想与活动通信,请使用共享的Bus. 您应该使用处理程序或主循环器在主线程上执行此操作,因为您可能正在使用IntentService. 该服务也可以充当生产者。重新创建您的活动时,将发布当前已知值。

您的活动只需要注册Bus并订阅正确的事件。当它暂停时,只需注销Bus.

于 2013-10-29T19:37:07.307 回答
0

在应用程序类中使用静态变量(扩展应用程序)。在服务内部,您可以设置此变量。在 Activity 中,您会定期读取此变量。

于 2013-10-24T11:58:57.540 回答
0

您应该使用massenger发送下载进度,因为它比广播接收器更安全且更便宜。

于 2013-10-28T10:21:08.717 回答
0

我相信实现这种持久性的最佳方法是:

  • 服务下载后,您应该将数据保存在数据库或文件中。

  • 然后服务发送广播进行更新。

  • 如果活动“活动”一切顺利,它会转到数据库/文件以获取更新的内容。

  • 如果活动被终止或其他原因,您只需要确保数据在数据库/文件中,这样当您启动/重新启动活动时,您就可以从数据库/文件中获取最新内容。

  • 下载时,以相同的方式将状态和进度保存在 db/file 中。

查看这个Google I/O Session,它很好地解释了这一点。

于 2013-10-23T17:25:59.930 回答