将数据从服务发送到活动和屏幕旋转

时间:2012-05-19 09:52:04

标签: android android-service android-activity

我正在使用一个执行操作的Intent服务,需要传回给它启动操作结果的活动。

我搜索过几十个类似的帖子但据我所知,我找到的所有解决方案都有问题。它们不能很好地处理屏幕旋转。假设一个活动启动了Intent Service,该服务需要10秒才能执行该操作,并且在这10秒内,屏幕会旋转。活动被销毁并创建一个新活动。

  1. 使用Receiver:它会产生内存泄漏,因为接收器绑定到必须销毁的活动,因此活动永远不会被破坏。
  2. 使用广播:您必须注册一个侦听器,并在活动被销毁之前取消注册侦听器。如果广播消息在未注册侦听器之后到达,并且在注册新活动的侦听器之前,将永远不会收到该消息。
  3. 使用消息:与接收者相同。
  4. 将共享首选项/数据库与侦听器一起使用:与广播相同。
  5. 我提出的解决方案是让服务将结果保存在首选项文件中,并定期检查活动(比如每200毫秒)以更改首选项文件。因此,当屏幕旋转时,活动停止检查,并在重新创建时再次启动。如果结果在两者之间传递,它仍然会进入(重新创建)活动。但是,似乎这会消耗CPU并从SD卡执行不必要的读取。

    另一种解决方案是让服务将结果保存在首选项文件/数据库中,并将全局变量设置为保存它的时间。该活动具有首选项文件/数据库的监听器。在注册侦听器之前,它会检查全局变量以查看是否在屏幕旋转期间放置了结果(global var< currentTimeMillies()),如果为true,则获取结果,如果不是,则注册侦听器。由于结果可能放在检查和注册之间,因此必须在一个块内完成,在该块中,活动持有锁,服务必须获取该锁以放置结果。这也可以,但它太复杂了。

    是否有更简单,更优雅的方式,在屏幕旋转后幸存下来?

1 个答案:

答案 0 :(得分:1)

看看我对这个问题的回答:

How to handle IPC between a service and an activity (and its subactivity)?

也许这会给你一个想法。

编辑(添加以下建议):

另一种方法是使用您在Activity中创建的Receiver。在屏幕旋转时,操作系统将调用onRetainNonConfigurationInstance(),您可以在其中返回Receiver实例,它将被传递给新的Activity(请参阅getLastNonConfigurationInstance())。注意:这些方法已在4.0中弃用,您可以使用Fragment和setRetainInstance()来实现类似的行为。