我有一个Android后台处理的一般问题,如何正确处理它?</ p>
想象一下这种情况:
Fragment中的BroadcastReciever在onResume()/ onPause()中注册/取消注册。一切看起来都不错,但是当用户在2)之后立即按下HOME按钮时,IntentService的结果广播已丢失。它发生了因为Fragment在onPasue()回调中未注册了他们的BroadcastReceiver。
有什么一般模式可以避免这个问题吗? 对于这个prupouse,使用ResultReceiver而不是BroadcastReceiver会更好吗?
我已经厌倦了ResultReceiver,在这种情况下我将ResultReceiver发送到Bundle中的服务(它实现Parcelable接口)但是由于更改屏幕方向而重新开始Activity ResultReceiver有&#34;脏&#34;引用可能导致错误的previus创建的Activity。
答案 0 :(得分:0)
您的IntentService可以在任务完成时创建通知,并将待处理的意图返回到您的活动,以防您的活动在接收任务完成广播之前进入后台。
如果您正考虑在任务完成时启动活动,则在用户退出应用程序后(通过主页或后退按钮),它不是建议的UI模式。来自android开发者网站:
状态栏通知应该用于a的任何情况 后台服务需要提醒用户有关该事件的信息 需要回应。后台服务永远不应该启动 活动本身就是为了接收用户的互动。服务 应该创建一个状态栏通知,将启动 用户选择时的活动。
答案 1 :(得分:0)
我只是创建自己的解决方案,但我不确定这是否正确。我的解决方案处理在这些场景中通过静态缓存提供结果:
I)
II)
此解决方案消耗内存,因为我们在静态缓存中保留最后一个结果。为了保存多个结果,我建议使用Android中的LruCache,但在这种情况下,您应该为每个请求设置id(例如,timestamp?)。
你能检查我的解决方案是否正确吗?它经过测试并且运行良好,但我不知道我的方式是否是解决此问题的最佳方法。