.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) 是否立即触发作业 运行 有 wifi

Does .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) trigger a job to run IMMEDIATELY there is wifi

.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) 是否会在 wifi 恢复时立即将作业触发到 运行,或者作业只是 运行 作为另一批预定作业的一部分 IF wifi 刚好可用。

我问的唯一原因是,因为我一直在试验,它似乎已经完成了两件事。以 Nougat 为例,当 wifi 恢复时,它似乎会立即触发作业 运行,而对于 Lollipop(我认为),它似乎只是在等待另一批作业 运行。

一个重要的细节,因为如果它没有触发作业 运行 在所有版本上始终如一,那么我需要一个广播接收器来 运行 我的上传,当 WIFI 恢复时。

不一定。使用 JobScheduler,您将控制权交给 Android 来决定 运行 某事的最佳时间。不过JobSchedulerService.java codemaybeQueueReadyJobsForExecutionLockedH方法的注释中有解释:

/**
 * The state of at least one job has changed. Here is where we could enforce various
 * policies on when we want to execute jobs.
 * Right now the policy is such:
 * If >1 of the ready jobs is idle mode we send all of them off
 * if more than 2 network connectivity jobs are ready we send them all off.
 * If more than 4 jobs total are ready we send them all off.
 * TODO: It would be nice to consolidate these sort of high-level policies somewhere.
 */

这告诉我,如果我有 两个 个作业在等待网络,那么当网络打开时它们将 运行。我对此进行了测试,发现它是真的。这很有帮助,但我不一定要等待两个作业排队,听起来你也不想。

我终于发现我可以通过 调用 SetOverrideDeadline 来更好地控制它何时 运行。通过设置截止日期,它会 运行 作业,即使在最初的时间不满足网络条件。显然,您的代码必须足够聪明才能在没有连接的情况下处理 运行ning,但是在初次尝试之后,它会等到所有条件都满足后再试。其原因不在上面的注释中(尽管它应该是),但在该方法的实际代码中可以找到。事实证明,如果有 any 个作业先前失败,则作业调度程序将 运行。这是来自相同 maybeQueueReadyJobsForExecutionLockedH 方法的相关片段:

for (int i=0; i<jobs.size(); i++) {
    JobStatus job = jobs.valueAt(i);
    if (isReadyToBeExecutedLocked(job)) {
        if (job.getNumFailures() > 0) {
            backoffCount++;
        }
... 

上面注意到 backoffCount 正在递增,因此它计算了之前失败的作业总数。然后几行之后:

if (backoffCount > 0 ||
        idleCount >= MIN_IDLE_COUNT ||
        connectivityCount >= MIN_CONNECTIVITY_COUNT ||
        chargingCount >= MIN_CHARGING_COUNT ||
        runnableJobs.size() >= MIN_READY_JOBS_COUNT) {
    ... run the jobs ...
    }

我希望这能为您节省一些时间 - 我为此苦苦挣扎了一段时间!