我有一个Service
使用新的MediaBrowserServiceCompat
与我的播放器实现进行交互。
这是我的服务onCreate()
@Override
public void onCreate() {
super.onCreate();
audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
initMediaSession();
initMediaPlayer();
}
和我的initMediaSession()
private void initMediaSession() {
Log.d(TAG, "initMediaSession: ");
mediaSessionCompat = new MediaSessionCompat(getApplicationContext(), TAG);
mediaSessionCompat.setCallback(new MediaSessionCompat.Callback() {
// I override the methods here
});
mediaSessionCompat.setActive(true);
// Method from MediaBrowserServiceCompat
setSessionToken(mediaSessionCompat.getSessionToken());
}
然后,我在我的MediaBrowserCompat
中访问我的Activity
:
@Override
public void onCreate() {
mediaBrowser = new MediaBrowserCompat(this, new ComponentName(this, MediaPlaybackService.class), mediaBrowserConnectionCallback, null);
mediaBrowser.connect();
}
// I do stuff here
@Override
protected void onDestroy() {
super.onDestroy();
if (mediaBrowser != null) {
mediaBrowser.disconnect();
}
}
每次调用mediaBrowser.connect()
时,都会在调用mediaBrowser.disconnect()
时创建并终止我的服务。
问题是当重新创建MediaSessionCompat
时,我丢失了我创建的任何元数据或者我可能保存的播放状态。
这是应该的样子还是mm我做错了?
此外,如果它应该是那样的话,那是否意味着我必须在某处保存我的元数据并在每次创建新的MediaSessionCompat.setMetadata()
对象时调用MediaSessionCompat
?还是有更有效的解决方案?
谢谢
答案 0 :(得分:7)
如MediaBrowserService and the modern media playback app blog中所述:
这包装了bound services的API,这是有道理的,因为我们正在尝试连接到服务。
绑定服务的生命周期直接与绑定到服务的人绑定:
当最后一个客户端从服务解除绑定时,系统会销毁该服务(除非该服务也是由startService()启动的)。
在您的情况下,服务将不再有任何人在onDestroy()和onCreate()之间绑定它。
Universal Android Music Player's MusicService的例子是:
这可确保绑定客户端中的更改不会导致服务在播放过程中被销毁。