java - Servicio en segundo plano para Android Oreo
push-notification android-service (3)
¿Cómo continuar el servicio en segundo plano en Android Oreo sin mostrar el punto de notificación? Continúo mi servicio en segundo plano utilizando la notificación, pero no quiero mostrar notificaciones para ejecutar el servicio.
Este código me funcionó. Primero asegúrate de:
1- Definir el servicio en Manifiesto
2- Definir el permiso en Manifiesto
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
3- Asegúrese de haber comenzado el servicio antes.
Su servicio debe tener una notificación. ¡Debe tener cuidado de que su notificación debe tener un ChannelID!
Esta página puede ayudarte:
¿Cómo crear un diseño de notificación personalizado en Android?
Ahora pegue el siguiente código en su servicio
@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()); } }
después de eso agregue este código:
@Override public ComponentName startForegroundService(Intent service) { return super.startForegroundService(service); }
y esto:
@Override public void onDestroy() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { stopForeground(true); } }
Esto no es posible en esta
API version (26)
y superior.
El sistema operativo Android cierra automáticamente su servicio si lo ejecuta sin mostrar una notificación al usuario.
Si está apuntando a
API >= 26
el sistema impondrá una restricción en su servicio para ejecutarse en segundo plano a menos que su actividad esté en primer plano.
Tan pronto como su actividad pase a segundo plano, el servicio finalizará cuando el sistema lo encuentre ejecutándose en segundo plano (consulte
las limitaciones del servicio
en segundo
plano
).
Al usar el método
startForegroundService()
, otorga ese permiso para ejecutar el servicio en segundo plano incluso cuando la actividad no se está ejecutando.
También una vez que se ha creado el servicio, el servicio debe llamar a su método
startForeground()
dentro de los cinco segundos.
Si hubiera leído la documentación de Android Oreo 8.0 correctamente en algún lugar here , es posible que no haya publicado esta pregunta aquí.
Paso 1: asegúrese de iniciar un servicio como un
Service
primer plano como se indica en el siguiente código
ContextCompat.startForegroundService(mainActivity, new Intent(getContext(), GpsServices.class));
ContextCompat.startForegroundService(mainActivity, new Intent(getContext(), BluetoothService.class));
ContextCompat.startForegroundService(mainActivity, new Intent(getContext(), BackgroundApiService.class));
Paso 2: use la notificación para mostrar que su servicio se está ejecutando. Agregue la siguiente línea de código en el método de
Service
onCreate
.
@Override
public void onCreate() {
...
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForeground(NOTIFICATION_ID, notification);
}
...
}
Paso 3: elimine la
notification
cuando el servicio se detenga o se destruya.
@Override
public void onDestroy() {
...
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
stopForeground(true); //true will remove notification
}
...
}
Un problema con esta solución es que seguirá mostrando la
notification
hasta que su
Service
se ejecute en todos los dispositivos con
Android Oreo 8.0
.
Estoy seguro de que esta solución funcionará incluso cuando la aplicación esté en segundo plano o en estado inactivo.
NOTA IMPORTANTE: MOSTRAR UNA NOTIFICACIÓN PARA EJECUTAR UN SERVICIO EN FONDO (APLICACIÓN EN FONDO O ESTADO ASESINADO) ES OBLIGATORIO EN ANDROID OREO 8.0. NO PUEDES CORRER LEJOS CON ÉL. ASÍ QUE SE RECOMIENDA QUE HAGA LOS CAMBIOS NECESARIOS EN SU APLICACIÓN PARA QUE FUNCIONE CORRECTAMENTE SEGÚN LAS MEJORES PRÁCTICAS SEGUIDAS O PEDIDAS POR ANDROID.
Espero que esto pueda ayudar a resolver su problema.