安卓任务调度程序设置setRequiresDeviceIdle属性

4

“setRequireDeviceIdle” 方法是怎样工作的?根据我在 Android 文档中(https://developer.android.com/reference/android/app/job/JobInfo.Builder.html#setRequiresDeviceIdle(boolean))所了解的,它应该保证只有在没有与设备交互时才会启动任务。

但我的经验与此不同:

private void scheduleRestartJob(){
    ComponentName mServiceComponent = new ComponentName(this, RelaunchAppJobService.class);

    JobInfo.Builder builder = new JobInfo.Builder(1002, mServiceComponent);
    builder.setRequiresDeviceIdle(true);
    builder.setPersisted(true);
    builder.setOverrideDeadline(10000);
    mJobScheduler.schedule(builder.build());
}

如果我退出应用程序并开始使用另一个应用程序,无论我是否活动,工作始终会在10秒后运行。
1个回答

1
如果我退出我的应用程序并开始使用另一个应用程序,无论我是否处于活动状态,该任务始终会在10秒后运行。这是因为这一行代码:
builder.setOverrideDeadline(10000);

引用文档

即使其他要求未满足,该任务也将在此截止日期前运行

(已加重)

因此,您的工作将在设备空闲或10秒钟后运行,以先到为准。很可能,10秒钟会先过去。


这很有道理,但在使用“setOverrideDeadline”之前,我使用了相同的10秒钟的“setPeriodic”。然而,行为是相同的(尽管文件没有提到它会忽略其他要求)。我在这里试图实现的是,如果用户闲置一段时间,重新启动我的应用程序。 - flame
你看到使用 setPeriodic 而没有使用 setOverrideDeadline 时出现这种行为的原因是,尽管文档中说了什么,但 setPeriodic 似乎会隐式地设置一个覆盖期限并忽略所有其他要求。看起来你可以通过在 onStartJob 方法中放置一个 if (!jobParameters.isOverrideDeadlineExpired()) 检查来解决这个 bug。 - HexAndBugs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接