背景
我想使用 Lollipop 上提供的新 JobScheduler API,但遗憾的是它没有用于 pre-Lollipop 的官方端口。
但是,有 GcmTaskService,它提供了非常相似的功能。
问题
这个 API 很新,所以很少有地方可以找到如何使用它的信息(例如这里和这里)。
问题
我对这个新 API 有几个问题:
似乎它需要使用 Google Play 服务(此处)(使用 Android 的 Lollipop 版本时除外,它将使用普通的 JobScheduler)。如果 Google Play 服务不可用,我该怎么办?
似乎即使我已将“setPersisted(true)”用于重复任务,但当我重新启动设备时,该任务将不会再次被调用。怎么会?编辑:那是因为我错过了 RECEIVE_BOOT_COMPLETED 的许可。
如果我不使用“setRequiredNetwork”,任务的默认行为是什么?是“NETWORK_STATE_ANY”吗?
文档说明了 onRunTask 返回的内容,我可以返回任何值“RESULT_FAILURE”、“RESULT_RESCHEDULE”、“RESULT_SUCCESS”(此处为信息)。似乎 FAILURE 和 SUCCESS 选项都会做同样的事情 - 从队列中删除任务。这是真的吗?如果是这样,它们之间究竟有什么区别?它们的功能不同吗?
“ TaskParams ”是否仅用于任务的标签?我可以使用 API 以某种方式将包传递给任务吗?否则,我需要设置一个数据库来存储应该传递给任务的内容,对吧?
应用程序是否可以获取任务队列?我知道可以使用 adb,但是也可以使用 API 吗?
他们说(这里)每个任务都有长达 3 分钟的唤醒锁。如果任务需要更多,应该怎么做?它应该为自己获取另一个唤醒锁吗?API 会警告唤醒锁已释放吗?这是文档所说的:
调度器会为你的服务持有一个 PowerManager.WakeLock,但是在执行三分钟后,如果你的任务没有返回,它将被认为已经超时,并且唤醒锁将被释放。此时重新安排您的任务将无效。如果您怀疑您的任务运行时间比这更长,您应该明确启动自己的服务或使用其他机制;此 API 旨在用于相对快速的网络操作。
他们说(在这里)每次应用程序升级/替换时都会删除所有网络任务,并且在发生这种情况时会调用“onInitializeTasks”,并且您可以再次重新安排它们。如何重新安排任务?我不认为我什至可以得到任务列表...
是否可以告诉任务更喜欢一天中的特定时间?例如,在 14:00-15:00 之间?
我注意到,如果您安排任务,然后强制停止和/或清除应用程序的数据,该任务仍将运行。我怎样才能避免这种行为?