提问者:小点点

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


我似乎很难得到一个直截了当的答案,所以我会提出一个更尖锐的问题。

我想创建一个启动/停止/暂停/可重置的计时器。如果计时器处于活动状态,即使我在应用程序中的其他地方或最小化应用程序,它也应该继续处于活动状态。如果应用程序被销毁/关闭/完全关闭,那么计时器可以关闭。

我查看了警报管理器,但它似乎并不适用于所有设备。服务是否是可行的替代方案/做我需要它做的事情?我将使用什么来实际执行计数?循环中的睡眠命令,将更新命令发送回广播接收器?

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


共1个答案

匿名用户

如果应用程序被销毁/关闭/完全关闭,则可以关闭计时器。

您似乎认为这在某种程度上不同于“转到应用程序中的其他位置或最小化应用程序”。它们不是。您的进程要么正在运行,要么没有运行,并且您的进程可以在您的UI不在前台的任何时间点终止。与通知绑定的前台服务是尽可能长时间保持进程的典型模式,但这不是绝对保证。

你是在暗示在这些设备上,无论我做什么(服务、定时器、IntentService、警报管理器、JobDispatcher等),它们都会杀死定时器,因为这些设备会杀死后台任务(除非我误解了页面)?

有两种方法可以完成预定的工作:

>

  • 进程内:TimerChenduledExecutorServicepostDelayed()等。

    进程外:警报管理器JobScheduler

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

    在Android 6.0上,HurmManagerJobScheduler受到打瞌睡模式和应用程序待机的影响。在以前的版本中,它们通常应该是可靠的。但是:

    >

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

    强制停止后没有任何东西幸存下来,通常只有当用户在设置中单击应用程序屏幕上的“强制停止”时才会发生,但在某些设备上发生得更频繁(例如,制造商绑定了某种内置的“任务管理器”以具有强制停止行为)

    因此,对于制造商在Android系统上搞砸的设备,可能没有任何形式的可靠调度机制。在某些情况下,实施打瞌睡模式前身的制造商提供了白名单机制,类似于打瞌睡模式在Android6.0上的表现,用户可以指示他们不希望受到节电措施影响的应用程序。