当系统自动终止服务时取消Android通知

Rob*_*ham 6 android android-notifications android-mediasession

我有一个实现的应用程序MediaBrowserServiceCompat。播放音乐时,它会在前台运行,并带有媒体控制通知,告知系统不可关闭。暂停时,它不显示在前台,并且保留通知。标准的东西。

当系统自动终止该服务时,不会删除该通知。

您可以通过将应用置于非前景暂停状态,离开应用并发出以下命令来模拟此情况:

adb shell am kill com.myapp.package
Run Code Online (Sandbox Code Playgroud)

通知仍然存在。您收到此Logcat消息:

W/ActivityManager: Scheduling restart of crashed service com.myapp.package/com.myapp.package.playback.platform.AndroidMediaService
Run Code Online (Sandbox Code Playgroud)

明显的挂钩(如没有onDestroyonTaskRemoved对服务等)似乎是叫-它似乎被彻底杀死。由于该服务始于START_NOT_STICKY,我们也不会onCreate在新实例上调用它。

的部分解决方案,这是使服务粘,并取消通知时的服务恢复。但是,这可能需要花费大量时间才能真正发生,在此期间通知不起作用,因此并不理想。它还可能会产生进一步的后果。

其他应用程序似乎对此没有任何问题。

重复这种情况(暂停,退出应用)并执行命令,例如在Google Play音乐上:

adb shell am kill com.google.android.music
Run Code Online (Sandbox Code Playgroud)

或Spotify:

adb shell am kill com.spotify.music
Run Code Online (Sandbox Code Playgroud)

并且您发现他们的通知会立即消失,就像它们在拆除时被取消一样。

他们会怎么做才能做到这一点?

Rob*_*ham 3

我已经找到了这个问题的答案,当然,这是我自己的错。其他应用程序没有什么特别之处 - 这是一种平台行为,而我们是异常值。

我后来发现,当从前台转换到后台时,我们调用了:

ServiceCompat.stopForeground(service, ServiceCompat.STOP_FOREGROUND_DETACH)
Run Code Online (Sandbox Code Playgroud)

我通过dumpsys以下方式发现了这一点:

adb shell dumpsys activity services com.google.android.music
Run Code Online (Sandbox Code Playgroud)

我发现了一些差异。

我的应用程序:

ServiceRecord{294309d u0 com.myapp.debug/com.myapp.playback.platform.AndroidMediaService}
    intent={cmp=com.myapp.debug/com.myapp.playback.platform.AndroidMediaService}
    packageName=com.myapp.debug
    processName=com.myapp.debug:main
    baseDir=/data/app/com.myapp.debug-GM-nBaeXA_e47EmJKnM27g==/base.apk
    dataDir=/data/user/0/com.myapp.debug
    app=ProcessRecord{83fb4ffd0 23567:com.myapp.debug:main/u0a381}
    createTime=-27s211ms startingBgTimeout=--
    lastActivity=-26s911ms restartTime=-27s211ms createdFromFg=true
    startRequested=true delayedStop=false stopIfKilled=true callStart=true lastStartId=2
Run Code Online (Sandbox Code Playgroud)

播放音乐:

ServiceRecord{8693ccb u0 com.google.android.music/.playback2.MusicPlaybackService}
    intent={cmp=com.google.android.music/.playback2.MusicPlaybackService}
    packageName=com.google.android.music
    processName=com.google.android.music:main
    baseDir=/data/app/com.google.android.music-lrn1VQr_3_RDi5PMbqozdw==/base.apk
    dataDir=/data/user/0/com.google.android.music
    app=ProcessRecord{9a3c417d0 22921:com.google.android.music:main/u0a191}
    isForeground=false foregroundId=1 foregroundNoti=Notification(channel=playback_v1 pri=0 contentView=null vibrate=null sound=null defaults=0x0 flags=0x2 color=0xffff5722 category=transport actions=5 vis=PUBLIC semFlags=0x0 semPriority=0 semMissedCount=0)
    createTime=-9m33s792ms startingBgTimeout=--
    lastActivity=-20s825ms restartTime=-9m33s792ms createdFromFg=true
    startRequested=true delayedStop=false stopIfKilled=false callStart=true lastStartId=1
Run Code Online (Sandbox Code Playgroud)

foregroundNoti您可以在我的应用程序日志中看到缺少的属性。这是分离调用的产物。我们很久以前就选择这样做,以避免系统收集通知。经过反思,我们应该像其他应用程序一样允许它被杀死。