Android .setRequiredNetworkType(JobInfo.NETWORK\u TYPE\u UNMETERED)是否会在wifi连接后立即触发作业运行

Android .setRequiredNetworkType(JobInfo.NETWORK\u TYPE\u UNMETERED)是否会在wifi连接后立即触发作业运行,android,android-jobscheduler,Android,Android Jobscheduler,.setRequiredNetworkType(JobInfo.NETWORK\u TYPE\u UNMETERED)是否会在wifi返回时立即触发作业运行,或者如果wifi恰好可用,该作业是否会作为另一批计划作业的一部分运行 我问这个问题的唯一原因是,因为我一直在做实验,它似乎做到了这两件事。以牛轧糖为例,当wifi恢复时,它似乎会触发作业立即运行,而对于棒棒糖(我认为),它似乎只是等待另一批作业运行 这是一个很重要的细节,因为如果它不能触发作业在所有Verison上一致运行,那么当WIFI恢

.setRequiredNetworkType(JobInfo.NETWORK\u TYPE\u UNMETERED)是否会在wifi返回时立即触发作业运行,或者如果wifi恰好可用,该作业是否会作为另一批计划作业的一部分运行

我问这个问题的唯一原因是,因为我一直在做实验,它似乎做到了这两件事。以牛轧糖为例,当wifi恢复时,它似乎会触发作业立即运行,而对于棒棒糖(我认为),它似乎只是等待另一批作业运行


这是一个很重要的细节,因为如果它不能触发作业在所有Verison上一致运行,那么当WIFI恢复时,我需要一个广播接收器来运行上传。

不一定。通过
JobScheduler
,您将控制权交给了Android,以决定运行某些东西的最佳时间。但是,
maybeQueueReadyJobsForExecutionLockedH
方法的注释中有一个解释:

/**
 * 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.
 */
这告诉我,如果我有两个作业等待网络,那么它们将在网络启动时运行。我测试了一下,发现是真的。这是有帮助的,但我不一定要等待两个工作排队,听起来你也不想

我终于发现,通过调用
setOverridedAdline
,我可以更好地控制它的运行时间。通过设置截止日期,即使在初始时间未满足网络条件,它也将运行作业。显然,您的代码必须足够智能,才能处理在没有连接的情况下运行的问题,但在初始尝试之后,它会等待所有条件都满足后重试。原因不在上面的注释中(虽然应该是),但在该方法的实际代码中可以找到。事实证明,如果有任何作业之前发生过故障,则作业调度程序将运行。以下是同一
方法中的相关代码片段:

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

我希望这能为你节省一些时间——我为此奋斗了一段时间

我也忘了提到这个命令,它给了我极大的帮助。要查看挂起和正在运行的作业及其条件,请在adb命令提示符下运行此命令:
adb shell dumpsys jobscheduler
Good info。读了这篇文章之后,我几乎确信我将使用广播接收器来监听RSSI_CHANGED_ACTION/Jobscheduler组合来触发我的上传。单是Jobscheduler似乎响应不够。
if (backoffCount > 0 ||
        idleCount >= MIN_IDLE_COUNT ||
        connectivityCount >= MIN_CONNECTIVITY_COUNT ||
        chargingCount >= MIN_CHARGING_COUNT ||
        runnableJobs.size() >= MIN_READY_JOBS_COUNT) {
    ... run the jobs ...
    }