【问题标题】:Android Job scheduler behavior when device goes for deep sleep设备进入深度睡眠时的 Android 作业调度程序行为
【发布时间】:2025-11-24 05:45:01
【问题描述】:

我目前正在使用一个 android 应用程序,该应用程序使用 android 作业调度程序以一定的时间间隔(假设每 4 小时)调用一个 api。 假设我的设备没有充电并且没有任何活动在它上面进行,所以它会在一段时间后进入睡眠状态(假设在最后一次 api 调用 1 小时后)。 现在,由于我故意进行的一些活动,我的设备在 5 小时后唤醒。调度程序会立即调用 api(自上次调用以来已超过 4 小时)?还是会等待接下来的 3 个小时才能运行该作业? (*在这种情况下,我没有获得唤醒锁,因此设备将进入睡眠状态。)

【问题讨论】:

    标签: android android-jobscheduler


    【解决方案1】:

    我认为你所说的深度睡眠是指打瞌睡。当您的设备处于打盹模式时,您的 JobServices 将不会触发。定期工作不能准确。作业要么是精确的,要么是周期性的。因此周期性将在执行间隔之间的维护窗口中触发。如果您在 Lollipop + 上频繁运行作业,则可能会跳过某些时间段,因为设备正在节省电池电量。

    查看打盹模式的限制:

    • 网络访问被暂停。
    • 系统忽略唤醒锁。
    • 标准 AlarmManager 警报(包括 setExact() 和 setWindow())推迟到下一个维护时段。
    • 如果您需要设置在打瞌睡时触发的警报,请使用 setAndAllowWhileIdle() 或 setExactAndAllowWhileIdle()。
    • 使用 setAlarmClock() 设置的警报继续正常触发 - 系统在这些警报触发前不久退出打盹。
    • 系统不执行 Wi-Fi 扫描。
    • 系统不允许同步适配器运行。
    • 系统不允许 JobScheduler 运行。

    但是您可以使用一些技巧来使您的工作在特定时间/在安排后立即执行。

    【讨论】:

    • Anton,您能否提出一个好的技巧,如您所说的,在调度后立即执行?我们尝试过使用 AlarmManager、JobScheduler、WorkManager ......似乎没有一个在深度睡眠期间醒来并完成我们的小工作。
    • Anton,能否请您提及一些有助于在打盹模式下运行后台任务的技巧?