Rad*_*luk 5 android mediabrowserservicecompat
我按照Android 指南在媒体播放器应用程序中使用 MediaBrowserServiceCompat,但该服务在应用程序退出时被销毁。
<service android:name=".media.PlaybackService">
<intent-filter>
<action android:name="android.media.browse.MediaBrowserService" />
</intent-filter>
</service>
Run Code Online (Sandbox Code Playgroud)
在应用程序启动时正确创建服务。按下按钮时mediaController.transportControls.play()被调用,并且在onPlay()调用我的会话回调类中的此方法之后。内部onPlay()服务启动:(context.startService(Intent(context, MediaBrowserServiceCompat::class.java))也尝试startForegroundService过 Oreo 及更高版本)并设置为前台:this@PlaybackService.startForeground(SERVICE_ID, notificationBuilder?.build())。创建了 Oreo 和更高 API 的通知通道。
现在通知已启动,我可以通过发出命令看到服务位于前台:
Run Code Online (Sandbox Code Playgroud)$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在我的应用程序中使用了唯一的一个调用,并删除了每个调用stopSelf和stopForeground测试。
在 API 28、26、22 和 18 上我得到了相同的结果。
我也尝试START_STICKY过从onStartCommand().
当然,您的连接可能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
)
Run Code Online (Sandbox Code Playgroud)
不要忘记:创建服务后,服务必须startForeground在五秒内调用其方法。
| 归档时间: |
|
| 查看次数: |
1191 次 |
| 最近记录: |