安卓手机APP开发__媒体开发部分__用媒体会话服务进行后台播放
目录
概述
当APP不在前台时,经常希望能够播放媒体。例如,一个音乐播放器
在用户锁屏或者是使用其它的APP时,通常是保持音乐播放的。
媒体3库提供了一系列的接口来允许你支持后台的播放。
使用一个媒体会话服务
为了启用后台播放,你应该包括播放器和在一个单独的服务中包括媒体会话。
这允许设备当你的APP不在前台时,继续进行媒体的服务。
媒体会话服务允许媒体的会话独立于APP的活动而运行。
当一个播放器在一个服务中时,你应该使用一个媒体会话服务。为了做这一点,
创建一个类来扩展媒体会话服务,并且创建你的媒体的会话在服务里。
使用媒体会话服务对于外部的客户端 连接你的APP,控制播放,而没有读取你的APP的用户
界面的活动,成为了可能。事实上,会有多个客户端的APP同时连接媒体会话服务,每个
APP都有它自己的媒体控制器。
实现服务的生命周期
你需要实现你的服务的三个生命周期的方法:
当第一个控制器要连接服务,服务被实例化和启动后,调用了onCreate()方法。
它是构建播放器和媒体会话的最好的地方。
当用户离开当前的任务时,调用onTaskRemoved(Intent)方法。如果播放在继续,
APP选择保持服务运行在前台。如果播放器被暂停,服务不在前台,需要被停止了。
当服务被停止时,调用onDestroy()方法,所有的资源包括播放器和会话都需要被释放。
Kotlin
Kotlin
class PlaybackService : MediaSessionService() {
private var mediaSession: MediaSession? = null
// Create your player and media session in the onCreate lifecycle event
override fun onCreate() {
super.onCreate()
val player = ExoPlayer.Builder(this).build()
mediaSession = MediaSession.Builder(this, player).build()
}
// The user dismissed the app from the recent tasks
override fun onTaskRemoved(rootIntent: Intent?) {
val player = mediaSession?.player!!
if (!player.playWhenReady
|| player.mediaItemCount == 0
|| player.playbackState == Player.STATE_ENDED) {
// Stop the service if not playing, continue playing in the background
// otherwise.
stopSelf()
}
}
// Remember to release the player and media session in onDestroy
override fun onDestroy() {
mediaSession?.run {
player.release()
release()
mediaSession = null
}
super.onDestroy()
}
}
当用户离开APP时,APP能停止服务。
Kotlin
Kotlin
override fun onTaskRemoved(rootIntent: Intent?) {
val player = mediaSession.player
if (player.playWhenReady) {
// Make sure the service is not in foreground.
player.pause()
}
stopSelf()
}
提供对媒体会话的读取
当服务创建后,覆盖onGetSession()方法,来给其它的客户端读取你的媒体会话
Kotlin
Kotlin
class PlaybackService : MediaSessionService() {
private var mediaSession: MediaSession? = null
// [...] lifecycle methods omitted
override fun onGetSession(controllerInfo: MediaSession.ControllerInfo): MediaSession? =
mediaSession
}
在配置文件中声明服务
一个APP在运行前台服务时需要权限。在配置文件中加上前台服务的权限,
如果是API在34及以上还要加上FOREGROUND_SERVICE_MEDIA_PLAYBACK。
XML
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
你也必须在配置文件中声明你的服务类,使用媒体会话服务的过滤器。
XML
<service
android:name=".PlaybackService"
android:foregroundServiceType="mediaPlayback"
android:exported="true">
<intent-filter>
<action android:name="androidx.media3.session.MediaSessionService"/>
</intent-filter>
</service>
你必须定义一个前台的服务类型,当你的APP运行在安卓10(API级别29)及以上时,
它要包括媒体播放。