繁体   English   中英

Android后台处理,处理结果和Activity生命周期

[英]Android background processing, handle result and Activity lifecycle

我在Android后台处理方面遇到一般性问题,如何正确处理?

想象一下这种情况:

  1. 用户从Fragment开始Activity。
  2. 片段开始使用IntenService从网络中获取数据。
  3. IntentService通过LocalBroadcast系统将结果提供回Fragment。

在此处输入图片说明

Fragment中的BroadcastReciever在onResume()/ onPause()中已注册/未注册。 一切看起来不错,但是当用户在2)之后立即按HOME按钮时,从IntentService广播的结果已丢失。 这是因为Fragment在onPasue()回调中未注册其BroadcastReceiver。

有什么通用模式可以避免此问题? 使用ResultReceiver而不是BroadcastReceiver对于这个prupouse会更好?

我对ResultReceiver感到厌倦,在这种情况下,我将ResultReceiver发送到Bundle中的服务(它实现了Parcelable接口),但是在重新创建Activity之后,由于更改了屏幕方向,ResultReceiver对以前创建的Activity进行了“肮脏”引用,这可能会导致错误。

您的IntentService可以在任务完成时创建一个通知,其中有待处理的意图会返回您的活动,以防您的活动在接收到任务完成广播之前进入后台。

如果您考虑在任务完成时启动活动,则在用户退出应用程序(通过主页或后退按钮)后,不建议使用UI模式。 从android开发者网站:

在任何情况下,后台服务需要提醒用户有关需要响应的事件时,都应使用状态栏通知。 后台服务永远不应自行启动活动以接收用户交互。 该服务应改为创建状态栏通知,该状态栏通知将在用户选择时启动活动。

我只是创建自己的解决方案,但是我不确定那是正确的。 我的解决方案在以下情况下通过静态缓存提供结果:

一世)

  • 片段启动IntentService以获取数据
  • 取消注册BroadcastReceiver时,用户按下HOME按钮并到达结果

II)

  • 片段启动IntentService以获取数据
  • 用户旋转设备并重新创建了Fragment,在此过程中,未注册BroadcastReceiver时结果到达

我的答案

此解决方案会消耗内存,因为我们将最后的结果保存在静态缓存中。 为了保存多个结果,我建议使用Android的LruCache ,但是在这种情况下,您应该为每个请求设置id(例如timestamp?)。

您能检查我的解决方案是否正确吗? 它已经过测试并且运行良好,但是我不知道我的方法是否是解决此问题的最佳方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM