绑定服务崩溃,出现“Context.startForegroundService() did not then call Service.startForeground()”错误

新手上路,请多包涵

我目前正在开发音频播放应用程序,并且正在使用已启动的绑定服务在后台播放音乐。我使用以下代码启动并绑定到该服务。

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

它在播放时被提升到前台,在音乐暂停时被降级。

 // onAudioPlay
service.startForeground(NOTIFY_ID, notification)

// onAudioPause
service.stopForeground(false)

到目前为止,服务工作正常。但是当用户在暂停状态下滑动(删除)通知时,服务会在几秒钟后崩溃并给出此错误。

 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)

这只发生在奥利奥上,我已经了解了奥利奥的背景限制。但以下几点让我感到烦恼。

  • 本服务为绑定服务(不受限制)
  • 我从不使用 Context.startForegroundService() 来启动服务。(并且不想使用它)
  • 该服务在从前台降级时不会崩溃,它会在删除通知时发生。

为什么服务崩溃了?我究竟做错了什么?如果有人告诉我这里发生了什么,我将非常感激。

原文由 UdeshUK 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.5k
2 个回答

扩展 UdeshUk 的答案- 任何使用 MediaButtonReceiver (构建未决意图或仅接收媒体按钮意图)都可能导致您的服务被调用 startForegroundService ,因为 MediaButtonReceiver.onReceive 以这种方式在 Oreo 上启动您的服务。我没有在任何地方看到这个记录。

原文由 Andy S 发布,翻译遵循 CC BY-SA 4.0 许可协议

我发现了问题。在我的通知中,我设置了

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

因此,当用户删除通知时,它会调用 startForegroundService() 因为我之前在暂停时调用了 stopForeground() 。

为了克服,我使用了一个自定义的待定意图并在 onStartCommand() 中处理它,而不是 MediaButtonReveiver 的 PendingIntent

原文由 UdeshUK 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题