我正在使用一个执行操作的 Intent 服务,并且需要将操作结果传递回启动它的活动。
我已经搜索了几十个类似的帖子,但据我所知,我发现的所有解决方案都有问题。他们不能很好地处理屏幕旋转。假设一个活动启动了 Intent 服务,该服务需要 10 秒来执行该操作,并且在这 10 秒内,屏幕会旋转。该活动被破坏并创建一个新活动。
- 使用接收器:它会造成内存泄漏,因为接收器绑定到必须销毁的活动,因此活动永远不会被销毁。
- 使用广播:您必须注册一个监听器,并在活动被销毁之前取消注册监听器。如果广播消息在监听器未注册之后到达,并且在新活动的监听器注册之前,将永远不会收到该消息。
- 使用消息:与接收者相同。
- 将共享首选项/数据库与侦听器一起使用:与广播相同。
我想出的解决方案是让服务将结果保存在首选项文件中,并定期检查活动(假设每 200 毫秒)以查看首选项文件中的更改。因此,当屏幕旋转时,活动停止检查,并在重新创建时重新开始。如果结果是在两者之间传递的,它仍然会到达(重新创建的)活动。但是,这似乎会消耗 cpu 并从 SD 卡执行不必要的读取。
另一种解决方案是让服务将结果保存在首选项文件/数据库中,并将全局变量设置为它保存它的时间。该活动有一个首选项文件/数据库的侦听器。在注册监听器之前,它会检查全局变量以查看是否在屏幕旋转期间放置了结果(global var < currentTimeMillies()),如果为真,则获取结果,如果不是,则注册监听器。由于结果可能放在检查和注册之间,因此必须在一个块内完成,在该块中活动持有一个锁,服务必须获取该锁才能放置结果。这也可以,但是太复杂了。
有没有一种更简单、更优雅的方法,可以在屏幕旋转中幸存下来?