[英]Android background processing, handle result and Activity lifecycle
我在Android后台处理方面遇到一般性问题,如何正确处理?
想象一下这种情况:
Fragment中的BroadcastReciever在onResume()/ onPause()中已注册/未注册。 一切看起来不错,但是当用户在2)之后立即按HOME按钮时,从IntentService广播的结果已丢失。 这是因为Fragment在onPasue()回调中未注册其BroadcastReceiver。
有什么通用模式可以避免此问题? 使用ResultReceiver而不是BroadcastReceiver对于这个prupouse会更好?
我对ResultReceiver感到厌倦,在这种情况下,我将ResultReceiver发送到Bundle中的服务(它实现了Parcelable接口),但是在重新创建Activity之后,由于更改了屏幕方向,ResultReceiver对以前创建的Activity进行了“肮脏”引用,这可能会导致错误。
您的IntentService可以在任务完成时创建一个通知,其中有待处理的意图会返回您的活动,以防您的活动在接收到任务完成广播之前进入后台。
如果您考虑在任务完成时启动活动,则在用户退出应用程序(通过主页或后退按钮)后,不建议使用UI模式。 从android开发者网站:
在任何情况下,后台服务需要提醒用户有关需要响应的事件时,都应使用状态栏通知。 后台服务永远不应自行启动活动以接收用户交互。 该服务应改为创建状态栏通知,该状态栏通知将在用户选择时启动活动。
我只是创建自己的解决方案,但是我不确定那是正确的。 我的解决方案在以下情况下通过静态缓存提供结果:
一世)
II)
此解决方案会消耗内存,因为我们将最后的结果保存在静态缓存中。 为了保存多个结果,我建议使用Android的LruCache ,但是在这种情况下,您应该为每个请求设置id(例如timestamp?)。
您能检查我的解决方案是否正确吗? 它已经过测试并且运行良好,但是我不知道我的方法是否是解决此问题的最佳方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.