使用服务创建即使应用程序最小化也能运行的计时器?
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 不在前台时,您的进程可以随时终止。前台 Service
与 Notification
相关联,是使进程尽可能长时间运行的典型模式,但这不是绝对保证。
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)?
有两种安排工作的方法:
进行中:Timer
、ScheduledExecutorService
、postDelayed()
等
进程外:AlarmManager
、JobScheduler
在所有 Android 版本中,当您的进程终止时,任何进程内计时也会消失。这就是自计算机发明以来大多数计算机的工作方式。因此,这些类型的调度选项适用于您只需要在进程 运行 时进行工作的情况(例如,更新屏幕上的运行时间计数器)。
在 Android 6.0+ 上,AlarmManager
和 JobScheduler
受打盹模式和应用待机的影响。在以前的版本中,它们通常应该是可靠的。然而:
一些设备制造商有效地创建了他们自己的打瞌睡模式等效物,并且这些制造商可能会消除警报和工作作为他们节能计划的一部分
强制停止后什么都不会幸免,这通常只有在用户在您的应用程序屏幕上的“设置”中单击 "Force Stop" 时才会发生,但在某些设备上发生的频率更高(例如,制造商绑定某种内置 "task manager" 具有强制停止行为)
因此,对于制造商用 Android 搞砸的设备,可能没有任何形式的可靠调度机制。在某些情况下,实施 Doze 模式前身的制造商提供了一种白名单机制,类似于 Doze 模式在 Android 6.0+ 上的作用,用户可以在其中指明他们不希望应用受到节电措施的影响。
我似乎很难直接回答这个问题,所以我会提出一个更尖锐的问题。
我想创建一个 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 不在前台时,您的进程可以随时终止。前台 Service
与 Notification
相关联,是使进程尽可能长时间运行的典型模式,但这不是绝对保证。
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)?
有两种安排工作的方法:
进行中:
Timer
、ScheduledExecutorService
、postDelayed()
等进程外:
AlarmManager
、JobScheduler
在所有 Android 版本中,当您的进程终止时,任何进程内计时也会消失。这就是自计算机发明以来大多数计算机的工作方式。因此,这些类型的调度选项适用于您只需要在进程 运行 时进行工作的情况(例如,更新屏幕上的运行时间计数器)。
在 Android 6.0+ 上,AlarmManager
和 JobScheduler
受打盹模式和应用待机的影响。在以前的版本中,它们通常应该是可靠的。然而:
一些设备制造商有效地创建了他们自己的打瞌睡模式等效物,并且这些制造商可能会消除警报和工作作为他们节能计划的一部分
强制停止后什么都不会幸免,这通常只有在用户在您的应用程序屏幕上的“设置”中单击 "Force Stop" 时才会发生,但在某些设备上发生的频率更高(例如,制造商绑定某种内置 "task manager" 具有强制停止行为)
因此,对于制造商用 Android 搞砸的设备,可能没有任何形式的可靠调度机制。在某些情况下,实施 Doze 模式前身的制造商提供了一种白名单机制,类似于 Doze 模式在 Android 6.0+ 上的作用,用户可以在其中指明他们不希望应用受到节电措施的影响。