.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)实际上是TRIGGER当wifi返回时立即运行的作业,或者作业是否只是作为另一个预定批量作业的一部分运行,如果wifi正好可用。
我问的唯一原因是,因为我一直在试验它似乎做了两件事。以Nougat为例,似乎实际上触发了当wifi回来时立即运行的工作,而使用Lollipop(我认为)它似乎只是等待另一批作业运行。
有一个重要的细节,因为如果它不会触发一个作业在所有版本上一致地运行,那么当WIFI回来时我需要一个广播接收器来运行我的上传。
答案 0 :(得分:0)
不一定。使用JobScheduler
,您可以控制Android以确定运行某些内容的最佳时间。但是,JobSchedulerService.java code在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.
*/
这告诉我,如果我有两个作业等待网络,那么它们将在网络启动时运行。我测试了它,发现它是真的。这很有帮助,但我不一定要等待两个工作排队,听起来你也没有。
我终于发现,通过也调用SetOverrideDeadline
,我可以更好地控制它的运行时间。通过设置截止日期,即使仅在初始时间内未满足网络标准,它也将运行作业。显然,你的代码必须足够聪明才能处理没有连接的运行,但是在初始尝试之后,它会等待直到满足所有条件才能再次尝试。其原因不在于上面的注释(尽管它应该是),但它可以在该方法的实际代码中找到。事实证明,如果任何作业先前发生故障,则作业计划程序将运行。以下是来自同一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 ...
}
我希望这可以节省你一些时间 - 我挣扎了一段时间!