Не могу остановить службу Firebase JobDispatcher

Возможный дубликат

Я создал сервис JobDispatcher, чтобы продолжать получать местоположение пользователя в фоновом режиме и публиковать местоположение пользователя на сервере. Для этого я создал работу следующим образом:

private void startLocationJobService() {
        // Check if location job service already running
        if(!isMyServiceRunning(LocationJobService.class)) {
            Context context = config.getActivity();
            FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(context));
            Job job = dispatcher.newJobBuilder()
                    .setLifetime(Lifetime.FOREVER)
                    .setService(LocationJobService.class)
                    .setTag(JOB_SERVICE_TAG)
                    .setReplaceCurrent(true)
                    .build();

            //creating new job and adding it with dispatcher
            dispatcher.mustSchedule(job);
        }
    }

private boolean isMyServiceRunning(Class<?> serviceClass) {
        ActivityManager manager = (ActivityManager) config.getActivity().getSystemService(Context.ACTIVITY_SERVICE);
        for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
            if (serviceClass.getName().equals(service.service.getClassName())) {
                return true;
            }
        }
        return false;
    }

В onStartJob службы я настраиваю api местоположения, чтобы получить местоположение пользователя

public boolean onStartJob(final JobParameters job) {
        Log.i("TAG", "Service Run onStartJob called");
        configureFusedLocation(LocationJobService.this);
        return true;
    } 

Служба запускается и продолжает работать, как и ожидалось. Но это не останавливает. Я использовал оба способа (dispatcher.cancel и stopService), чтобы остановить службу следующим образом:

public void stopService() {
        if(isMyServiceRunning(LocationJobService.class)) {
            config.getActivity().stopService(new Intent(config.getActivity(), LocationJobService.class));
            cancelLocationJobService();
        }
    }

private void cancelLocationJobService(){
        FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(config.getActivity()));
        // Cancel the job for this tag
        dispatcher.cancel(JOB_SERVICE_TAG);
        //Cancel all the jobs for this package
        dispatcher.cancelAll();
    }

1 ответ

Решение

Вам нужно отменить работу, отменив регистрацию слушателя местоположения и позвонив jobFinished() внутри LocationJobService.

Как dispatcher.cancelAll() работает только для отмены запланированных заданий, которые еще не запущены. Вы можете использовать такие инструменты, как Eventbus сообщить службе, когда остановиться.

Обратитесь к https://medium.com/google-developers/scheduling-jobs-like-a-pro-with-jobscheduler-286ef8510129 для получения дополнительной информации.

Другие вопросы по тегам