使用服务创建即使应用程序最小化也能运行的计时器?

Using a Service to create a timer that runs even if the app is minimized?

我似乎很难直接回答这个问题,所以我会提出一个更尖锐的问题。

我想创建一个 start/stop/pause/resettable 的计时器。如果计时器处于活动状态,即使我转到应用程序中的其他位置或最小化应用程序,它也应该继续处于活动状态。如果应用程序被销毁/关闭/完全关闭,则可以关闭计时器。

我查看了 AlarmManager,但它似乎并不适用于所有设备。服务是否是一个可行的替代方案/做我需要它做的事?我会用什么来实际执行计数?将更新命令发送回 BroadcastReceiver 的循环中的睡眠命令?

当计时器达到 0 时,如何让它向用户发送通知?

If the app is destroyed / shut down / closed altogether then the timer can be shut down.

您似乎认为这与 "go somewhere else in the app or minimize the app" 有某种不同。他们不是。您的进程要么是 运行,要么不是,当您的 UI 不在前台时,您的进程可以随时终止。前台 ServiceNotification 相关联,是使进程尽可能长时间运行的典型模式,但这不是绝对保证。

Are you implying that on those devices, no matter what I do (Service, Timer, IntentService, AlarmManager, JobDispatcher, etc), they will kill the timer because those devices kill background tasks (unless I misunderstood the page)?

有两种安排工作的方法:

  • 进行中:TimerScheduledExecutorServicepostDelayed()

  • 进程外:AlarmManagerJobScheduler

在所有 Android 版本中,当您的进程终止时,任何进程内计时也会消失。这就是自计算机发明以来大多数计算机的工作方式。因此,这些类型的调度选项适用于您只需要在进程 运行 时进行工作的情况(例如,更新屏幕上的运行时间计数器)。

在 Android 6.0+ 上,AlarmManagerJobScheduler 受打盹模式和应用待机的影响。在以前的版本中,它们通常应该是可靠的。然而:

  • 一些设备制造商有效地创建了他们自己的打瞌睡模式等效物,并且这些制造商可能会消除警报和工作作为他们节能计划的一部分

  • 强制停止后什么都不会幸免,这通常只有在用户在您的应用程序屏幕上的“设置”中单击 "Force Stop" 时才会发生,但在某些设备上发生的频率更高(例如,制造商绑定某种内置 "task manager" 具有强制停止行为)

因此,对于制造商用 Android 搞砸的设备,可能没有任何形式的可靠调度机制。在某些情况下,实施 Doze 模式前身的制造商提供了一种白名单机制,类似于 Doze 模式在 Android 6.0+ 上的作用,用户可以在其中指明他们不希望应用受到节电措施的影响。