Android JobScheduler setRequiresDeviceIdle作业未触发

时间:2018-05-12 14:55:33

标签: android android-jobscheduler

这类似于thisthis - 但它们并没有回答我的问题,也就是一年多以前。

我编写了一个简单的代码来安排定期作业,但也写了设备空闲时。

注意:我不使用Android-Job库。

简单活动:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.d("TEST123", "onCreate: ");
        JobScheduler j = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
        j.schedule(new JobInfo.Builder(1, new ComponentName(this, MyJobService.class))
                .setPeriodic(10 * 60 * 1000)
                .setRequiresDeviceIdle(true)
                .build());
    }
}

服务本身:

public class MyJobService extends JobService {

    @Override
    public boolean onStartJob(JobParameters params) {
        Log.d("TEST123", "onStartJob: ");
        return false;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        return false;
    }
}

清单部分:

        <service
        android:name=".MyJobService"
        android:permission="android.permission.BIND_JOB_SERVICE"></service>

在Android O 8.0 x86模拟器上运行时,作业永远不会触发。 我已经尝试过的事情:

  • 我等了(等等)
  • “关闭”模拟器屏幕
  • 将应用置于背景中
  • 完全关闭了应用程序(仅供参考:因为它定期是作业服务本身继续运行它)
  • 将模拟器置于'force-idle'...(尽管文档明确说明它与'idle'不是同一类型)
    • 在没有附加调试器的情况下运行应用程序

命令的输出:与我的工作相关的sysdump jobscheduler:

JOB #u0a83/1: e1e90f com.example.myapplication/.MyJobService
u0a83 tag=*job*/com.example.myapplication/.MyJobService
Source: uid=u0a83 user=0 pkg=com.example.myapplication
JobInfo:
  Service: com.example.myapplication/.MyJobService
  PERIODIC: interval=+15m0s0ms flex=+10m0s0ms
  Requires: charging=false batteryNotLow=false deviceIdle=true
  Backoff: policy=1 initial=+30s0ms
  Has early constraint
  Has late constraint
Required constraints: TIMING_DELAY DEADLINE IDLE
Satisfied constraints: TIMING_DELAY DEADLINE APP_NOT_IDLE DEVICE_NOT_DOZING
Unsatisfied constraints: IDLE
Tracking: IDLE TIME
Enqueue time: -1h0m0s393ms
Run time: earliest=-55m0s393ms, latest=-45m0s393ms
Ready: false (job=false user=true !pending=true !active=true !backingup=true comp=true)

正如你所看到的,似乎工作应该很久以前就已经解雇了,但是并没有,而且只是因为空闲约束。 任何人都可以重现这一点或理解为什么会发生这种情况吗?

1 个答案:

答案 0 :(得分:0)

你正在强迫你的模拟器进入打盹模式,我假设是为了测试目的。设备的等效命令是adb shell dumpsys deviceidle force-idle。在打盹模式下,系统不允许JobScheduler运行。看看其他一些限制。

请参阅此documentation

  

打盹限制
  在Doze中,以下限制适用于您的应用:

     
      
  • 网络访问暂停。
  •   
  • 系统忽略唤醒锁定。
  •   
  • 标准AlarmManager警报(包括setExact()和setWindow())将延迟到下一个维护窗口。      
        
    • 如果需要设置在Doze中触发的警报,请使用setAndAllowWhileIdle()或setExactAndAllowWhileIdle()。
    •   
    • 使用setAlarmClock()设置的警报继续正常启动 - 系统在警报触发前不久退出Doze。
    •   
  •   
  • 系统不执行Wi-Fi扫描。
  •   
  • 系统不允许同步适配器运行。
  •   
  • 系统不允许JobScheduler运行。
  •   

如果您需要在打盹模式下执行调度程序,则需要使用AlarmManager的setAndAllowWhileIdle()setExactAndAllowWhileIdle() API。