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

时间:2017-07-25 17:19:31

标签: android service timer android-service alarmmanager

我似乎很难对此做出正确答案,所以我会提出一个更尖锐的问题。

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

我查看了AlarmManager,但它似乎并不能在所有设备上正常工作。服务是否是可行的替代方案/做我需要做的事情?我会用什么来实际计算呢?循环中的sleep命令,它将更新命令发送回BroadcastReceiver?

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

1 个答案:

答案 0 :(得分:2)

  

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

您似乎认为这与“在应用中的其他位置或最小化应用程序”有所不同。他们不是。您的进程正在运行,或者它没有运行,并且您的进程可以在您的UI不在前台的任何时间点终止。与Service绑定的前景Notification是一种尽可能长时间保持处理的典型模式,但这不是绝对的保证。

  

你暗示在那些设备上,无论我做什么(Service,Timer,IntentService,AlarmManager,JobDispatcher等),它们都会杀死计时器,因为那些设备会杀死后台任务(除非我误解了页面)? / p>

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

  • 正在处理:TimerScheduledExecutorServicepostDelayed()

  • 进程外:AlarmManagerJobScheduler

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

在Android 6.0及更高版本中,AlarmManagerJobScheduler会受到打盹模式和应用待机状态的影响。在以前的版本中,它们通常是可靠的。但是:

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

  • 强制停止时没有任何东西存在,通常只有当用户在“设置”中点击应用程序屏幕上的“强制停止”时才会出现,但在某些设备上更常出现(例如,制造商绑定某种内置在“任务经理”中有强制停止行为)

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