Если кто-то все еще пытается выйти из ситуации,
Вот обходной путь для >= Android N (если вы хотите установить периодическое задание менее 15 минут)
Убедитесь, что используется только setMinimumLatency. Кроме того, если вы выполняете задачу, которая занимает много времени, следующее задание будет запланировано на время завершения текущего задания + PROVIDED_TIME_INTERVAL.
.SetPeriodic(длинные миллисекунды) хорошо работает для уровня API ниже Android N
@Override
public boolean onStartJob(final JobParameters jobParameters) {
Log.d(TAG,"Running service now..");
//Small or Long Running task with callback
//Call Job Finished when your job is finished, in callback
jobFinished(jobParameters, false );
//Reschedule the Service before calling job finished
if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
scheduleRefresh();
return true;
}
@Override
public boolean onStopJob(JobParameters jobParameters) {
return false;
}
private void scheduleRefresh() {
JobScheduler mJobScheduler = (JobScheduler)getApplicationContext()
.getSystemService(JOB_SCHEDULER_SERVICE);
JobInfo.Builder mJobBuilder =
new JobInfo.Builder(YOUR_JOB_ID,
new ComponentName(getPackageName(),
GetSessionService.class.getName()));
/* For Android N and Upper Versions */
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
mJobBuilder
.setMinimumLatency(60*1000) //YOUR_TIME_INTERVAL
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
}
ОБНОВЛЕНИЕ: если вы планируете запустить повторяющееся задание в режиме дремоты и думаете о JobScheduler, к вашему сведению: программам JobSchedulers не разрешено работать в режиме дремоты.< /сильный>
Я не говорил о Dozing, потому что мы говорили о JobScheduler. Спасибо, @Elletlar, за указание на то, что некоторые могут подумать, что оно будет работать, даже когда приложение находится в спящем режиме, что не так.
Для спящего режима AlarmManager по-прежнему является лучшим решением. Вы можете использовать setExactAndAllowWhileIdle(), если хотите запускать периодическое задание в определенный период времени, или использовать setAndAllowWhileIdle( ), если вы проявляете гибкость.
Вы также можете использовать setAlarmClock(), так как устройство всегда выходит из спящего режима для будильника и снова возвращается в спящий режим. Другой способ — использовать FCM.
person
MRah
schedule
11.12.2017