Как правильно остановить службу переднего плана? - PullRequest
0 голосов
/ 16 ноября 2018

Я использую startForeground, чтобы мой сервис "сохранялся" в фоновом режиме и не был уничтожен ОС.
Я удаляю сервис в методе основного действия onDestroy, вызывая stopForeground и stopService.Проблема заключается в том, что когда я удаляю свое приложение с последних приложений, чтобы убить его, сеанс отладки все еще выполняется, тогда как при "нормальном" функционировании (без использования startForeground) сеанс отладки завершается правильно.
Использование оболочки adb подтверждаетчто приложение все еще работает.
startForeground каким-то образом создает «специальный» запущенный поток, который нельзя остановить, просто остановив передний план и службу.
Любые идеи, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Если вы хотите остановить свою службу при очистке приложения от недавней задачи, вам нужно определить атрибут stopWithTask для службы в файле манифеста, как показано ниже

  <service
    android:enabled="true"
    android:name=".ExampleService"
    android:exported="false"
    android:stopWithTask="true" />

затем вы можете переопределить метод onTaskRemoved в сервисе, он будет вызываться при очистке задачи приложения

@Override
    public void onTaskRemoved(Intent rootIntent) {
        System.out.println("onTaskRemoved called");
        super.onTaskRemoved(rootIntent);
        //do something you want
        //stop service
        this.stopSelf();
    }
0 голосов
/ 16 ноября 2018

Я не знаю, правильно ли это, но в моем приложении я остановил службу переднего плана здесь, и она работает. Проверьте код

private void stopForegroundService() {

    // Stop foreground service and remove the notification.
    stopForeground(true);

    // Stop the foreground service.
    stopSelf();
}

ОБНОВЛЕНИЕ

Вызовите stopservice из вашего основного класса каким-либо образом (не из onDestroy), например:

    Intent intent = new Intent(this, MyForeGroundService.class);
    intent.setAction(MyForeGroundService.ACTION_STOP_FOREGROUND_SERVICE);
    startService(intent);

MyForegroundService.java

 private static final String TAG_FOREGROUND_SERVICE = "FOREGROUND_SERVICE";

public static final String ACTION_START_FOREGROUND_SERVICE = "ACTION_START_FOREGROUND_SERVICE";

public static final String ACTION_STOP_FOREGROUND_SERVICE = "ACTION_STOP_FOREGROUND_SERVICE";

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (intent != null) {
            String action = intent.getAction();

            switch (action) {
                case ACTION_START_FOREGROUND_SERVICE:
                    startForegroundService();
                    break;
                case ACTION_STOP_FOREGROUND_SERVICE:

                    stopForegroundService();
                    break;
            }
        }
        return START_STICKY;
    }

  private void stopForegroundService() {
    Log.d(TAG_FOREGROUND_SERVICE, "Stop foreground service.");

    // Stop foreground service and remove the notification.
    stopForeground(true);

    // Stop the foreground service.
    stopSelf();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...