Фоновая служба Android с планировщиком заданий для уведомлений - PullRequest
0 голосов
/ 01 февраля 2019

Я использую Job Scheduler для уведомлений Android.Мой код работает нормально.Но иногда я получаю уведомление дважды.Но я дал один минутный интервал для обслуживания.Что я сделаю, чтобы служба работала правильно?

Это мой код планировщика заданий для запуска службы, и я использую только службу.

JobScheduler jobScheduler = (JobScheduler) getSystemService (Context.JOB_SCHEDULER_SERVICE);ComponentName componentName = новое ComponentName (getApplicationContext (), NotifyService.class);

            JobInfo jobInfo = new JobInfo.Builder(15,componentName)
                    .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
                    .setPeriodic(60000)
                    .setPersisted(true)
                    .build();

            jobScheduler.schedule(jobInfo);

1 Ответ

0 голосов
/ 19 марта 2019

Это может быть поздняя запись, но вы можете использовать WorkManager в Android для настройки периодического рабочего запроса.

Я использую WorkManager, и кажется, что он работает надежно.

Вы можете прочитать больше о других рабочих примитивах, чтобы удовлетворить вашу задачу здесь , ноПриведенная ниже реализация использует Worker для работы с потоками в WorkManager, который синхронно выполняет работу в фоновом потоке.

public class BackgroundWorker extends Worker {

    public BackgroundWorker
            (@NonNull Context context,
             @NonNull WorkerParameters params) {
             super(context, params);
    }

    @NonNull
    @Override
    public Worker.Result doWork() {     
        yourBackgroundTask();  // yourBackgroundTask() implementation
        return Result.success();
    }

    public static void schedulePeriodicWork(Data data) {
        // When multiple constraints are specified like below, 
        // your task will run only when all the constraints are met.
        Constraints constraints = new Constraints.Builder()
                        .setRequiredNetworkType(NetworkType.CONNECTED)
                        .setRequiresBatteryNotLow(true)
                        .setRequiresCharging(true)
                        .build();

        PeriodicWorkRequest taskWork = new PeriodicWorkRequest.Builder(BackgroundWorker.class, 60,
                TimeUnit.MINUTES)
                .setConstraints(constraints)
                .setInputData(data)
                .build();

        WorkManager.getInstance().enqueue(taskWork);
    } 
}

Позже в вашем файле MainActivity, внутри onCreate():

Data data = workData();

BackgroundWorker.schedulePeriodicWork(data);

Затем вне метода onCreate(),

private Data workData() {
    return new Data.Builder() // to build Data objects
        .build();
}

Одна небольшая вещь дляобратите внимание, что хотя мы устанавливаем вышеупомянутую задачу для выполнения каждые 60 минут, каждая итерация может не выполняться в один и тот же интервал времени.

Согласно документации Android, WorkManager предназначен для отложенной работы, и некоторые отклонения должны быть допустимы.Тем не менее, вы можете проверить консоль журнала на наличие обновлений "WM-WorkerWrapper: Worker result SUCCESS for Work".

Надеюсь, это полезно.

...