我有一项服务,可以从互联网上下载一些数据,并定期向指标活动发送进度。在处理服务结束时发送结果。
我有一个问题是什么是实现沟通持久性的最佳方式。
Messenger或ResultReceiver,我需要将它们包含到Intent中并存储服务中的侦听器列表。但是在配置更改活动破坏时,很难维护此列表。
LocalBroadcastManager,我需要从Messages迁移到Intents,并且此类中没有粘性发送。因此,如果我在进度活动处于后台时得到结果,结果将会丢失。
BroadcastManager很好,但我不需要广播我的进度系统和安全问题。
有什么想法吗?
答案 0 :(得分:2)
您可能想尝试一下Otto(http://square.github.io/otto/)。
在您的服务中,只要您想与活动进行通信,请使用共享的Bus
发布新活动。您应该在主线程上使用处理程序或主循环器执行此操作,因为您可能正在使用IntentService
。该服务也可以作为生产者。重新创建活动后,将发布当前已知值。
您的活动只需要在Bus
注册并订阅正确的活动。暂停时,只需注销Bus
即可。
答案 1 :(得分:0)
我相信实现这种持久性的最佳方式是:
服务下载后,您应将数据保存在数据库或文件中。
然后该服务发送广播进行更新。
如果活动“活着”,一切顺利,它会转到数据库/文件以获取更新的内容。
如果活动被杀死了,您只需要确保数据在数据库/文件中,这样当您启动/重新启动活动时,您可以从数据库/文件中获取最新内容。
下载时保持状态和进度保存在db / file中的方式相同。
检查this Google I / O会话,它解释了这非常好。
答案 2 :(得分:0)
在Application类中使用静态变量(扩展Application)。在内部服务中设置此变量。在Inside Activity中,你会定期阅读这些变量。
答案 3 :(得分:0)
您应该使用massenger发送下载进度,因为它比广播接收器更安全,更便宜。