Así que no estoy seguro de dónde / cómo implementar este método para que mi servicio se ejecute en primer plano. Actualmente comienzo mi servicio por lo siguiente en otra actividad:
Intent i = new Intent(context, myService.class);
context.startService(i);
Y luego en myServices 'onCreate () pruebo el startForeground () ...?
Notification notification = new Notification();
startForeground(1, notification);
Así que sí, estoy un poco perdido e inseguro de cómo implementar esto.
Respuestas:
Comenzaría completando completamente el
Notification
. Aquí hay un proyecto de muestra que demuestra el uso destartForeground()
.fuente
1337
?Desde su actividad principal, inicie el servicio con el siguiente código:
Luego, en su servicio
onCreate()
, crearía su notificación y la configuraría como primer plano de esta manera:fuente
Este es mi código para configurar el servicio en primer plano:
Necesito crear una notificación usando PendingIntent, para poder comenzar mi actividad principal desde la notificación.
Para eliminar la notificación, simplemente llame a stopForeground (true);
Se llama en onStartCommand (). Consulte mi código en: https://github.com/bearstand/greyparrot/blob/master/src/com/xiong/richard/greyparrot/Mp3Recorder.java
fuente
Intent.FLAG_ACTIVITY_NEW_TASK
no es válido en el contexto dePendingIntent
.Solución para Oreo 8.1
He encontrado algunos problemas como RemoteServiceException debido a una identificación de canal no válida con las versiones más recientes de Android. Así es como lo resolví:
Actividad :
Servicio de fondo:
EQUIVALENTE DE JAVA
fuente
ContextCompat.startForegroundService(Context,Intent)
en tu Actividad lo que hará lo correcto. ( developer.android.com/reference/android/support/v4/content/… ).setCategory(NotificationCompat.CATEGORY_SERVICE)
lugar deNotification.CATEGORY_SERVICE
si su API mínima es <21Build.VERSION_CODES.P
(nivel de API 28) o posterior debe solicitar el permisoManifest.permission.FOREGROUND_SERVICE
para usarlastartForeground()
; consulte developer.android.com/reference/android/app/…Además de la respuesta RAWA , esta paz de código:
Puedes cambiar a:
Si observa dentro de este método, puede ver que este método hace todo el trabajo de comprobación por usted.
fuente
Si desea que IntentService sea un servicio en primer plano
entonces deberías anular
onHandleIntent()
así¿Cómo hacer una notificación?
sencillo. Aquí está el
getNotification()
métodoComprensión más profunda
¿Qué sucede cuando un servicio se convierte en un servicio en primer plano?
¿Qué es un servicio en primer plano?
Un servicio en primer plano,
se asegura de que el usuario sea consciente de que algo está sucediendo en segundo plano al proporcionar la notificación.
(lo más importante) no es eliminado por el sistema cuando se queda sin memoria
Un caso de uso del servicio en primer plano
Implementación de la funcionalidad de descarga de canciones en una aplicación de música
fuente
Agregar el código dado Clase de servicio para "OS> = Build.VERSION_CODES.O" en onCreate ()
Agregue este permiso en el archivo de manifiesto:
fuente
Manejar la intención en el inicio Comando de servicio mediante.
Esta llamada eliminará el servicio del estado de primer plano , lo que permitirá que se elimine si se necesita más memoria. Esto no detiene la ejecución del servicio . Para eso, debe llamar a stopSelf () o métodos relacionados.
El valor de paso verdadero o falso se indica si desea eliminar la notificación o no.
Manejar su tarea cuando se destruye se llama por stopSelf () .
Cree una notificación para mantener el servicio ejecutándose en primer plano.
Dé un botón de detención en la notificación para detener el servicio cuando el usuario lo necesite.
fuente
Nota: Si su aplicación se dirige al nivel 26 o superior de la API, el sistema impone restricciones sobre el uso o la creación de servicios en segundo plano a menos que la aplicación esté en primer plano.
Si una aplicación necesita crear un servicio en primer plano, la aplicación debe llamar
startForegroundService()
. Ese método crea un servicio en segundo plano, pero el método le indica al sistema que el servicio se promoverá a sí mismo en primer plano.Una vez que el servicio ha sido creado, el servicio debe llamar a su
startForeground() method within five seconds.
fuente
startForegroundService
métodoEn mi caso, fue totalmente diferente ya que no estaba teniendo actividad para iniciar el servicio en Oreo.
A continuación se detallan los pasos que utilicé para resolver este problema de servicio en primer plano:
Y después de eso para iniciar este servicio, activé debajo de cmd:
adb -s "+ serial_id +" shell am startforegroundservice -n com.test.socket.sample / .SocketService
Esto me ayuda a iniciar el servicio sin actividad en dispositivos Oreo :)
fuente
La solución @mikebertiean casi hizo el truco, pero tuve este problema con un giro adicional: uso el sistema Gingerbread y no quería agregar un paquete adicional solo para ejecutar la notificación. Finalmente encontré: https://android.googlesource.com/platform/frameworks/support.git+/f9fd97499795cd47473f0344e00db9c9837eea36/v4/gingerbread/android/support/v4/app/NotificationCompatGingerbread.java
luego llego a un problema adicional: la notificación simplemente mata mi aplicación cuando se ejecuta (cómo resolver este problema: Android: cómo evitar que al hacer clic en una notificación se llame a onCreate () ), en total mi código en servicio se ve así (C # / Xamarin):
fuente