El locking del service vinculado con "Context.startForegroundService () no llamó al error Service.startForeground ()"

Encontré el problema. En mi notificación, he establecido

setDeleteIntent(MediaButtonReceiver.buildMediaButtonPendingIntent(service, PlaybackStateCompat.ACTION_STOP)) 

Entonces, cuando el usuario elimina la notificación, llama a startForegroundService () porque llamé a stopForeground () anteriormente al hacer una pausa.


Pregunta

Actualmente estoy trabajando en la aplicación de reproducción de audio y estoy usando un service enlazado iniciado para reproducir música en segundo plano. Comienzo y me uno al service usando el siguiente código.

 val intent = Intent(context, MusicService::class.java) context.startService(intent) context.bindService(intent, serviceConnection, 0) 

Se promociona al primer plano cuando se reproduce y se degrada cuando la música está en pausa.

 // onAudioPlay service.startForeground(NOTIFY_ID, notification) // onAudioPause service.stopForeground(false) 

El service funciona bien hasta ahora. Pero cuando el usuario hace una pausa en la notificación (eliminada) en estado de pausa, el service se bloquea después de unos segundos dando este error.

 E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.myplayer, PID: 4380 android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground() android.app.ActivityThread$H.handleMessage(ActivityThread.java:1775) android.os.Handler.dispatchMessage(Handler.java:105) android.os.Looper.loop(Looper.java:164) android.app.ActivityThread.main(ActivityThread.java:6541) java.lang.reflect.Method.invoke(Native Method) com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 

Esto solo ocurre en Oreo y ya leí sobre las limitaciones de background en Oreo. Pero los siguientes puntos me molestan.

  • Este service es un service vinculado (que no se ven afectados por las limitaciones)
  • Nunca utilizo Context.startForegroundService () para iniciar el service. (Y no quiero usarlo)
  • El service no se cuelga cuando se degrada de primer plano, sucede cuando se elimina la notificación.

¿Por qué el service está fallando? ¿Qué estoy haciendo mal? Estoy muy agradecido si alguien me dice qué está pasando aquí.

De los documentos 8.0 Cambios de comportamiento

El sistema permite a las aplicaciones llamar a Context.startForegroundService () incluso mientras la aplicación está en segundo plano. Sin embargo, la aplicación debe llamar al método startForeground () de ese service dentro de los cinco segundos posteriores a la creación del service.

Por lo tanto, debe llamar a startForeground dentro deCreate () para su service.