前台 MediaBrowserService 在应用退出时被终止

Posted

技术标签:

【中文标题】前台 MediaBrowserService 在应用退出时被终止【英文标题】:Foreground MediaBrowserService is killed on app exit 【发布时间】:2019-03-29 15:40:26 【问题描述】:

我正在关注android guide 在媒体播放器应用中使用 MediaBrowserServiceCompat,但该服务在应用退出时被销毁。

    <service android:name=".media.PlaybackService">
        <intent-filter>
            <action android:name="android.media.browse.MediaBrowserService" />
        </intent-filter>
    </service>

在应用程序启动时服务被正确创建。在按下按钮时调用 mediaController.transportControls.play() 并在调用我的会话回调类中的 onPlay() 方法之后。在onPlay() 内部启动服务:context.startService(Intent(context, MediaBrowserServiceCompat::class.java))(也尝试过 startForegroundService 用于 Oreo 及更高版本)并设置为前台:this@PlaybackService.startForeground(SERVICE_ID, notificationBuilder?.build())。 Oreo 和更高 API 的通知通道已创建。

现在通知已经启动,我可以通过发出命令看到服务在前台:

$adb shell dumpsys activity services PlaybackService
(...)
isForeground=true foregroundId=1 foregroundNoti=Notification(channel=MyChannelId pri=0 contentView=null vibrate=null sound=null defaults=0x0 flags=0x62 color=0xff000000 category=transport actions=1 vis=PUBLIC)
(...)

到目前为止,一切正常,但是当我按下主页按钮时,我希望服务保持启动状态,而是调用了我的 MediaBrowserServiceCompat 类的 onDestroy() 方法。返回应用程序并再次启动服务后,它没有设置为前台(也没有通知)。

我在我的应用程序中使用了唯一一个 startService 调用,并删除了对 stopSelfstopForeground 的所有调用以进行测试。

在 API 28、26、22 和 18 上,我得到了相同的结果。

我也试过从onStartCommand()返回START_STICKY

【问题讨论】:

您找出问题所在了吗?我遇到了完全相同的问题,很高兴知道你做了什么。 Google 的文档对于 MediaBrowserService 及其错综复杂的内容非常糟糕 很遗憾,我没有时间完善这个爱好项目,所以我忍受了用户体验退化。 @RikvanVelzen 你明白了吗?我遇到了同样的问题,找不到任何相关文档 【参考方案1】:

很可能是您的MediaBrowser 连接是保持MediaBrowserService 继续运行的唯一因素,而关闭该连接会导致MediaBrowserService 被破坏。

就我而言,我决定在创建 MediaBrowser 之前创建服务:

// Create the media browser service
Intent intent = new Intent(application, MusicService.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) 
    context.startForegroundService(intent);
 
else 
    context.startService(mixerIntent);


// Create connection with the service
mediaBrowser = MediaBrowserCompat(
        context,
        ComponentName(requireContext(), MusicService::class.java),
        connectionCallbacks,
        null
)

不要忘记:服务创建后,服务必须在五秒内调用其startForeground 方法。

【讨论】:

以上是关于前台 MediaBrowserService 在应用退出时被终止的主要内容,如果未能解决你的问题,请参考以下文章

将媒体项添加到 MediaBrowserService

是否可以连接到 Spotify 的 MediaBrowserService?

不在前台时位置服务被杀死

从 MediaBrowserService 更新活动中的搜索栏的最佳方法?

带有 ExoPlayer 和 PlayerControlView 的 MediaBrowserService - 如何从 UI (PlayerControlView) 访问播放器实例?

Ext JS 存储在应缓冲数据时意外重新加载数据