我有一项服务需要满足以下条件
1)服务需要在应用程序处于前台时运行。
2)活动轮换时,不停止服务
3) 即使您在打开一个特定片段时最小化应用程序,该服务也必须保持活动状态。
4)当活动停止(不是通过旋转)并且它不是特定的片段时,停止服务。
我在 onstart/onstop 中启动/停止我的服务。我最终使用布尔值来跟踪屏幕是否在旋转。
我正在像这样开始/停止我的服务
context.getApplicationContext().startService(intent)
context.getApplicationContext().stopService(intent)
除了一种情况外,它工作得很好。
当您在横向关闭屏幕时,Android 出于某种原因决定它需要重新创建整个活动,并在整个生命周期中调用。我已经在 4.4 和 5.0.1 的基本应用程序中复制了它,并且它已在其他线程中显示,例如 this。
当它这样做时,不能依赖旋转/不旋转,我猜测由于事情发生的速度有多快(多个 onStop/onStarts),它会导致竞争条件。当我返回应用程序时,有时它会工作,有时会挂起(没有错误),有时会运行两个服务。
它变成了一个兔子洞,我开始检查,当它进入 onStart 时屏幕是否关闭,所以下次调用 onStart 时它知道它是从一个被标记为旋转的屏幕关闭游戏返回(因为Android 现在正在将其从纵向锁定屏幕旋转回横向)。这越来越荒谬,而且效果不佳。
一个线程建议使用无头片段让它在旋转中存活,但是当应用程序关闭时我仍然需要它停止,所以我最终遇到了同样的问题。
有没有推荐的方法来解决这个问题?如果应用程序关闭(除了 1 片段),则不允许该服务保持活动状态,这将只是一个巨大的电池消耗,并且它需要在旋转中幸存下来,否则它会中断事情。