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

时间:2016-08-08 14:50:51

标签: android asynchronous service background

我有一个Android后台处理的一般问题,如何正确处理它?<​​/ p>

想象一下这种情况:

  1. 用户使用片段启动活动。
  2. 片段开始使用IntenService从网络中获取数据。
  3. IntentService通过LocalBroadcast将结果提供回Fragment 系统。
  4. enter image description here

    Fragment中的BroadcastReciever在onResume()/ onPause()中注册/取消注册。一切看起来都不错,但是当用户在2)之后立即按下HOME按钮时,IntentService的结果广播已丢失。它发生了因为Fragment在onPasue()回调中未注册了他们的BroadcastReceiver。

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

    我已经厌倦了ResultReceiver,在这种情况下我将ResultReceiver发送到Bundle中的服务(它实现Parcelable接口)但是由于更改屏幕方向而重新开始Activity ResultReceiver有&#34;脏&#34;引用可能导致错误的previus创建的Activity。

2 个答案:

答案 0 :(得分:0)

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

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

  

状态栏通知应该用于a的任何情况   后台服务需要提醒用户有关该事件的信息   需要回应。后台服务永远不应该启动   活动本身就是为了接收用户的互动。服务   应该创建一个状态栏通知,将启动   用户选择时的活动。

答案 1 :(得分:0)

我只是创建自己的解决方案,但我不确定这是否正确。我的解决方案处理在这些场景中通过静态缓存提供结果:

I)

  • 片段启动IntentService以获取数据
  • 用户按HOME按钮,结果在BroadcastReceiver播放时到达 未注册

II)

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

my_answer

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

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