Служба планировщика заданий не работает, когда приложение закрыто - PullRequest
4 голосов
/ 12 марта 2019

Я работаю над приложением для Android, которое требует выполнения фоновой задачи каждый час (планировщик заданий или служба). Задача выполняется, когда приложение работает, но как только я убиваю приложение с переднего плана, сервис не работает. Есть ли другой способ добиться этого?

1. Услуги

public class NotificationService extends JobService {

    private void PrintLog()
    {
        Log.d("DGVCL", "PrintLog()");
    }

    @Override
    public boolean onStartJob(JobParameters jobParameters) {
        Log.d("DGVCL", "onStartJob()");
        PrintLog();
        jobFinished(jobParameters, false);
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters jobParameters) {
        Log.d("DGVCL", "onStopJob()");
        return true;
    }
}

2. Основная деятельность

JobScheduler jobScheduler = (JobScheduler)getApplicationContext().getSystemService(JOB_SCHEDULER_SERVICE);
        ComponentName componentName = new ComponentName(this, NotificationService.class);
        JobInfo jobInfo = new JobInfo.Builder(1, componentName)
                .setPeriodic(Global.NOTIFICATION_TIME_PERIOD)
                .setBackoffCriteria(Global.NOTIFICATION_TIME_PERIOD, JobInfo.BACKOFF_POLICY_LINEAR)
                .setPersisted(true).build();
        jobScheduler.schedule(jobInfo);

3. манифеста

<service android:name="com.hopesndreams.hiren.hd.service.NotificationService" android:permission="android.permission.BIND_JOB_SERVICE" >
    </service> 

Ответы [ 4 ]

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

Действительно, 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".

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

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

* Использование AlarmManager *

Шаг 1: Создать Сервис

Сделайте свою логику здесь, в сервисе

        public class AService extends Service {

        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            //do something
        }

        @Override
        public void onCreate() {
            //do somrthing
        }
    }

Шаг 2. Создание приемника BroadCast

Начните свой сервис с этого.

        public class AReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            try {
                Intent intent = new Intent(context, AService.class);
                context.startService(intent);
            } catch (Exception e) {
            }
        }
    }

в MainActivity

   Intent liveIntent = new Intent(getApplicationContext(), AReceiver.class);
    PendingIntent recurring = PendingIntent.getBroadcast(getApplicationContext(), 0, liveIntent, PendingIntent.FLAG_CANCEL_CURRENT);
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Calendar updateTime = Calendar.getInstance();
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, updateTime.getTimeInMillis(), 16 * 60 * 1000, recurring);
    //wakeup and starts service in every 16 minutes.

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

Не забудьте добавить службу в манифест

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

@ hiren patel .. Посмотрите пример .. он работает нормально.

Планировщик заданий в фоновом режиме

Я думаю, вам нужно запланировать планировщик, прежде чем убивать или уничтожать ..

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

спасибо ..

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

Используйте WorkManager, он построен на основе JobScheduler, и он специально создан для использования всех фоновых сервисов, как переднего, так и фонового. https://developer.android.com/topic/libraries/architecture/workmanager

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...