0

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

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 片段),则不允许该服务保持活动状态,这将只是一个巨大的电池消耗,并且它需要在旋转中幸存下来,否则它会中断事情。

4

1 回答 1

-3

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

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

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

于 2015-03-23T22:28:53.173 回答