通过旋转保持服务活动的问题,离开应用程序时终止,以及在横向关闭屏幕

Problems keeping service alive through rotate, killing when leaving app, and turning screen off in landscape

我有一项服务需要满足以下条件

1) 当应用程序在前台时,服务需要 运行。

2) activity轮换时,不停止服务

3) 即使您在某个特定片段打开时最小化应用程序,该服务也必须保持活动状态。

4) 当activity停止(不是通过rotate)并且不是特定片段时,停止服务。

我 starting/stopping 我在 onstart/onstop 服务。我最终使用布尔值来跟踪屏幕是否在旋转。

我starting/stopping我的服务是这样的

context.getApplicationContext().startService(意图)

context.getApplicationContext().stopService(意图)

除了一种情况外,它工作得很好。

当您关闭横向屏幕时,Android 出于某种原因决定它需要重新创建整个 activity,并调用整个生命周期。我已经在 4.4 和 5.0.1 的基本应用程序中复制了它,并且它已经在其他线程中显示,例如这个。

Problems understanding the life cycle when screen goes off and on

当它这样做时,不能依赖 rotating/not 旋转,我猜测由于事情发生的速度有多快(多个 onStop/onStarts),它导致了竞争条件.当我 return 到应用程序时,有时它可以工作,有时它会挂起(没有错误),有时两个服务会 运行.

它变成了一个兔子洞,我开始做检查,例如,当它进入 onStart 时屏幕是否关闭,所以下次调用 onStart 时它知道它正在从屏幕关闭娱乐回来标记为已旋转(因为 Android 现在正在将其从纵向锁定屏幕旋转回横向)。它越来越荒谬,而且效果不佳。

一个线程建议使用无头片段让它在旋转中存活下来,但我仍然需要它在应用程序关闭时停止,所以我最终遇到了同样的问题。

有什么推荐的方法可以解决这个问题吗?如果应用程序关闭(第 1 个片段除外),则不能允许该服务保持活动状态,这只会消耗大量电池,并且它需要在旋转中存活下来,否则它会中断事情。

如果您不需要在应用程序关闭时 运行 服务,为什么还要使用它?只需在应用程序启动时触发后台线程并在那里完成您的工作。

更新: 您可以从应用程序 class(或其后代)启动服务,而不是从 Activity 启动服务。您可以在应用程序后台运行或被终止时停止它,然后在应用程序恢复时再次启动它。

最常用的方法是跟踪当前有多少活动处于恢复状态。这意味着在每个 Activitie 的 onPause() 和 onResume() 中,您都会递减或递增此计数器。如果计数器为 0,则表明您的应用程序处于后台。注意:您可能想在 onPause() 中添加延迟以减少计数器,因为当然会有从一个 Activity 转换到另一个(或切换方向)的时间,其中 Activity A 将是在 Activity B 开始之前暂停。