До сих пор я использовал AlarmManager для отправки HTTP-запроса каждые 30 минут. Но недавно я столкнулся с предупреждением в консоли Google Play: Чрезмерные пробуждения. Когда я прочитал подробности предупреждения, в нем говорилось, что AlarmManager чрезмерно пробуждает устройства.
Затем я исследовал, что еще я мог бы использовать для отправки запроса каждые 30 минут. В результате я нашел эту документацию. Рекомендуется использовать JobScheduler или JobDispatcher. Прежде всего, я пытался использовать JobScheduler, но для этого требовался API 21, что мне не подходит. Мне нужно поддерживать устройства из API 16 в моем текущем проекте. Тогда я решил использовать JobDispatcher.
Это мой JobService:
public class MyJobService extends JobService {
@Override
public boolean onStartJob(final JobParameters params) {
Log.d("JobDispatcherLog", params.getTag()+ " STARTED");
jobFinished(params, true);
return true;
}
@Override
public boolean onStopJob(JobParameters params) {
Log.d("JobDispatcherLog", params.getTag()+ " STOPPED");
return false;
}
}
Здесь я создаю задание, которое должно запускать службу каждые 30 минут.
FirebaseJobDispatcher dispatcher =
new FirebaseJobDispatcher(new GooglePlayDriver(this));
RetryStrategy retryStrategy =
dispatcher.newRetryStrategy(
RetryStrategy.RETRY_POLICY_LINEAR, 1800, 86400);
Job job = dispatcher.newJobBuilder()
.setService(MyJobService.class)
.setTag("very-important-job")
.setLifetime(Lifetime.FOREVER)
.setReplaceCurrent(true)
.setRetryStrategy(retryStrategy)
.setConstraints(Constraint.ON_ANY_NETWORK)
.build();
dispatcher.mustSchedule(job);
Я протестировал этот код и получил следующий результат в LogCat:
03-16 18:01:08.540 D/JobDispatcherLog: very-important-job STARTED
03-16 18:43:41.747 D/JobDispatcherLog: very-important-job STARTED
03-16 20:12:01.361 D/JobDispatcherLog: very-important-job STARTED
Как видите, он не запускается каждые 30 минут.
Мой вопрос: это нормальное поведение для JobDispatcher? Как запустить службу ровно каждые 30 минут? Если это невозможно, что еще я могу использовать для реализации ранее указанной функции?