我有一个应用程序,实现了MediaBrowserServiceCompat
。播放音乐时,它在前台运行,并显示系统无法取消的媒体控制通知。暂停后,它退出前台,通知被保留。这是标准的操作。
当此服务被系统自动终止时,通知不会被移除。
您可以通过将应用程序置于非前台暂停状态,离开应用程序并发出此命令来模拟此过程:
adb shell am kill com.myapp.package
通知仍然存在。您会收到以下Logcat消息:
W/ActivityManager: Scheduling restart of crashed service com.myapp.package/com.myapp.package.playback.platform.AndroidMediaService
所有明显的钩子(例如onDestroy
,onTaskRemoved
等)在服务上似乎都没有被调用 - 它似乎被直接终止了。由于服务是使用START_NOT_STICKY
启动的,因此我们也不会在新实例上调用onCreate
。
这个问题的部分解决方案是使服务具有“粘性”,并在服务重新启动时取消通知。然而,这可能需要相当长的时间才能实现,这段时间内通知无法工作,因此并不理想。它还可能产生进一步的后果。
其他应用程序似乎没有遇到这个问题。
重复这种情况(暂停,离开应用程序)并执行命令,例如在Google Play音乐上:
adb shell am kill com.google.android.music
或者 Spotify:
adb shell am kill com.spotify.music
你发现他们的通知在被拆除时立即消失,好像它们被取消了。
他们可能做了什么来实现这一点?
adb dumpsys
,我发现其他服务(例如Play Music)即使在后台也保留其foregroundNoti
属性。我的没有。因此,我怀疑在暂停音频时对服务执行的操作有所不同。 - Rob Pridham