Фоновая служба для 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);
}
}