我跟踪Android指南在媒体播放器应用程序中使用MediaBrowserServiceCompat,但是在app退出时该服务被销毁。
<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高级API的通知通道。
现在启动了通知,我可以通过发出命令看到服务处于前台:
$adb shell虚拟活动服务PlaybackService (.)(.) isForeground=true foregroundId=1 pri=0 contentView=null vibrate=null sound=null defaults=0x0 flags=0x62 color=0xff000000 category=transport actions=1 vis=PUBLIC)
到目前为止,一切正常,但当我按home按钮时,我希望服务仍然启动,但是MediaBrowserServiceCompat类的MediaBrowserServiceCompat方法将被调用。在返回应用程序并再次启动服务之后,它不会被设置为前台(也没有通知)。
我在我的应用程序中使用了唯一的一个startService调用,并删除了对stopSelf和stopForeground的每次测试调用。
在API 28、26、22和18上,我得到了相同的结果。
我还尝试从onStartCommand()返回START_STICKY。
发布于 2020-12-22 18:38:37
当然,您的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
)不要忘记:一旦创建了服务,服务必须在5秒内调用其startForeground方法。
https://stackoverflow.com/questions/55420923
复制相似问题