Android 通过轮换、离开应用程序时杀戮以及在景观中关闭屏幕来维持服务的问题

Android 通过轮换、离开应用程序时杀戮以及在景观中关闭屏幕来维持服务的问题,android,android-fragments,android-service,android-lifecycle,android-service-binding,Android,Android Fragments,Android Service,Android Lifecycle,Android Service Binding,我有一项服务需要满足以下条件 1) 该服务需要在应用程序处于前台时运行 2) 活动轮换时,请勿停止服务 3) 即使在打开一个特定片段时最小化应用程序,该服务也必须保持活动状态 4) 当活动停止(不是通过旋转)并且不是特定片段时,停止服务 我正在启动/停止onstart/onstop中的服务。最后我用一个布尔值来跟踪屏幕是否在旋转 我这样开始/停止我的服务 context.getApplicationContext().startService(意图) context.getApplication

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

1) 该服务需要在应用程序处于前台时运行

2) 活动轮换时,请勿停止服务

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

4) 当活动停止(不是通过旋转)并且不是特定片段时,停止服务

我正在启动/停止onstart/onstop中的服务。最后我用一个布尔值来跟踪屏幕是否在旋转

我这样开始/停止我的服务

context.getApplicationContext().startService(意图)

context.getApplicationContext().stopService(意图)

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

当你在景观中关闭屏幕时,Android出于某种原因决定需要重新创建整个活动,并在整个生命周期中调用。我在4.4和5.0.1的一个基本应用程序中复制了这一点,并在其他类似的线程中显示了这一点

当它这样做时,旋转/不旋转是不可靠的,我猜由于事情发生的速度有多快(多个启动/启动),它导致了比赛条件。当我返回应用程序时,有时它会工作,有时会挂起(没有错误),有时会运行两个服务

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

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


有什么建议的方法来解决这个问题吗?如果应用程序关闭(除1段外),该服务将无法保持活动状态,这将是一个巨大的电池消耗,它需要在旋转中生存,否则会中断工作。

如果应用程序关闭时不需要服务运行,为什么要使用该服务?只需在应用程序启动时启动一个后台线程,然后在那里完成您的工作

更新: 您可以从应用程序类(或其子类)启动服务,而不是从活动启动服务。你可以在你的应用程序被备份或终止时停止它,然后在应用程序恢复时再次启动它


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

这是一个第三方库,通过蓝牙与某些硬件一起工作。该服务与硬件进行通信,在一个特定的片段上,它必须保持活动状态。它也在其他片段中使用,但是如果在那些屏幕上关闭它也没关系。但是我该如何关闭它呢?据我所知,没有应用程序生命周期,只有活动。使用Application.ActivityLifecycleCallbacks仍然会在活动生命周期之外触发,当我在横向模式下关闭屏幕时也会遇到同样的问题?是的,这并不理想。最常用的方法是跟踪当前有多少活动处于恢复状态。这意味着在每个活动onPause()和onResume()中,您都会减少或增加此计数器。如果计数器为0,则您知道您的应用程序位于后台。注意:您可能希望在onPause()中增加一个延迟,以减少计数器,因为在从一个活动转换到另一个活动(或切换方向)时,活动a将在活动B开始之前暂停。好的,我将对此进行一次尝试并报告。谢谢看起来这可能是可行的,我不得不使用600毫秒的延迟,否则在关闭横向屏幕的情况下,我仍然会有一些奇怪的行为。明天我会做更多的测试,确保一切正常。