这类似于this和this - 但它们并没有回答我的问题,也就是一年多以前。
我编写了一个简单的代码来安排定期作业,但也写了设备空闲时。
注意:我不使用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模拟器上运行时,作业永远不会触发。 我已经尝试过的事情:
命令的输出:与我的工作相关的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)
正如你所看到的,似乎工作应该很久以前就已经解雇了,但是并没有,而且只是因为空闲约束。 任何人都可以重现这一点或理解为什么会发生这种情况吗?
答案 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。