Фоновая служба для android oreo

Как продолжить фоновое обслуживание в android Oreo без указания точки оповещения? Я продолжаю мой фоновый сервис, используя уведомление, но я не хочу показывать уведомление для запуска службы.

Ответ 1

Если бы вы где-то здесь правильно прочитали Документацию по Android Oreo 8.0, возможно, вы не разместили этот вопрос здесь.

Шаг 1: Убедитесь, что вы запускаете сервис в качестве приоритетного Service как указано в приведенном ниже коде

ContextCompat.startForegroundService(mainActivity, new Intent(getContext(), GpsServices.class));
ContextCompat.startForegroundService(mainActivity, new Intent(getContext(), BluetoothService.class));
ContextCompat.startForegroundService(mainActivity, new Intent(getContext(), BackgroundApiService.class));

Шаг 2: Используйте уведомление, чтобы показать, что ваш сервис работает. Добавьте ниже строку кода в методе Service onCreate.

@Override
public void onCreate() {
    ...
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        startForeground(NOTIFICATION_ID, notification);
    }
    ...
}

Шаг 3: Удалить notification когда служба остановлена или уничтожена.

@Override
public void onDestroy() {
    ...
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
          stopForeground(true); //true will remove notification
    }
    ...
}

Одна из проблем этого решения заключается в том, что оно будет отображать notification до тех пор, пока ваша Service будет запущена на всех устройствах, работающих под управлением Android Oreo 8.0.

Я уверен, что это решение будет работать, даже когда приложение находится в фоновом режиме или в состоянии уничтожения.

ВАЖНОЕ ПРИМЕЧАНИЕ: ПОКАЗЫВАНИЕ УВЕДОМЛЕНИЯ ДЛЯ ЗАПУСКА СЕРВИСА НА ФОНЕ (ПРИЛОЖЕНИЕ В ФОНЕ ИЛИ УДАЛЕННОМ СОСТОЯНИИ) ОБЯЗАТЕЛЬНО В ANDROID OREO 8.0. Вы не можете бежать с ним ТАК ЧТО РЕКОМЕНДУЕТСЯ, ЧТО ВЫ ДЕЛАЕТЕ НЕОБХОДИМЫЕ ИЗМЕНЕНИЯ В ВАШЕМ ПРИЛОЖЕНИИ, ЧТОБЫ СДЕЛАТЬ ЭТО РАБОТУ ПРАВИЛЬНО В СООТВЕТСТВИИ С ЛУЧШИМИ ПРАКТИКАМИ, СЛЕДУЮЩИМИ ИЛИ СПРОСОВАННЫМИ ANDROID.

Я надеюсь, что это может помочь решить вашу проблему.

Ответ 2

Это невозможно в этой API version (26) и выше. ОС Android автоматически закрывает ваш сервис, если вы запускаете его, не показывая пользователю уведомления.

Если вы нацеливаетесь на API >= 26 система наложит ограничение на ваш сервис, работающий в фоновом режиме, если только вы не работаете на переднем плане. Как только ваша деятельность переходит в фоновый режим, служба будет остановлена, когда система обнаружит, что она работает в фоновом режиме (см. Фоновые ограничения службы).

Используя startForegroundService() вы даете это разрешение на запуск службы в фоновом режиме, даже если действие не выполняется. Кроме того, после создания службы она должна вызвать метод startForeground() течение пяти секунд.

Ответ 3

Этот код работал для меня. Сначала убедитесь, что:

1- Определить службу в манифесте

2- Определите разрешение в манифесте

  <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

3- Убедитесь, что вы запустили службу раньше.

Ваш сервис должен иметь уведомление. Вы должны быть осторожны, что Ваше уведомление должно иметь идентификатор канала!

эта страница может помочь вам:

Как создать пользовательский макет уведомления в Android?

Android, как показать уведомление на экране

Теперь вставьте следующий код в ваш сервис

@Override
    public void onCreate() {
        super.onCreate();
            try {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    startForeground(" your Notification ID ", notification);
                }
            } catch (Exception e) {
                Log.e(" Error --->> ", e.getMessage());
            }
    }

после этого добавьте этот код:

@Override
public ComponentName startForegroundService(Intent service) {
    return super.startForegroundService(service);
}

и это:

@Override
public void onDestroy() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        stopForeground(true);
    }
}