应用程序退出时,前景MediaBrowserService被杀死

时间:2019-03-29 15:40:26

标签: android mediabrowserservicecompat

我正在跟随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))(对于Oreo及更高版本,也尝试了startForegroundService),并将其设置为前台:this@PlaybackService.startForeground(SERVICE_ID, notificationBuilder?.build())。创建了Oreo nad和高级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)
(...)

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

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

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

我也尝试过从START_STICKY返回onStartCommand()

1 个答案:

答案 0 :(得分:0)

您的 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 方法。