每次运行时更改都会重新创建 MediaBrowserServiceCompat 实例
MediaBrowserServiceCompat instance is recreated every runtime changes
我有一个 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());
}
然后我在 Activity
:
中访问我的 MediaBrowserCompat
@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
被重新创建时,我丢失了我创建的任何元数据或我可能保存的播放状态。
这是应该的方式还是我做错了?
此外,如果它应该是那样,是否意味着我必须在某处保存我的元数据并在每次创建新的 MediaSessionCompat
对象时调用 MediaSessionCompat.setMetadata()
?还是有更有效的解决方案?
谢谢
如MediaBrowserService and the modern media playback app blog所述:
this wraps the API for bound services, which makes sense since we’re trying to connect to a Service.
绑定服务的生命周期与谁绑定到服务直接相关:
When the last client unbinds from the service, the system destroys the service (unless the service was also started by startService()).
对于您的情况,在 onDestroy() 和 onCreate() 之间,服务将不再绑定任何人。
Universal Android Music Player's MusicService的例子是:
- 播放开始时调用 startService(new Intent(this, MediaPlaybackService.class)
- 播放停止时调用 stopSelf()
这确保绑定客户端的更改不会导致服务在播放过程中被破坏。
我有一个 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());
}
然后我在 Activity
:
MediaBrowserCompat
@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
被重新创建时,我丢失了我创建的任何元数据或我可能保存的播放状态。
这是应该的方式还是我做错了?
此外,如果它应该是那样,是否意味着我必须在某处保存我的元数据并在每次创建新的 MediaSessionCompat
对象时调用 MediaSessionCompat.setMetadata()
?还是有更有效的解决方案?
谢谢
如MediaBrowserService and the modern media playback app blog所述:
this wraps the API for bound services, which makes sense since we’re trying to connect to a Service.
绑定服务的生命周期与谁绑定到服务直接相关:
When the last client unbinds from the service, the system destroys the service (unless the service was also started by startService()).
对于您的情况,在 onDestroy() 和 onCreate() 之间,服务将不再绑定任何人。
Universal Android Music Player's MusicService的例子是:
- 播放开始时调用 startService(new Intent(this, MediaPlaybackService.class)
- 播放停止时调用 stopSelf()
这确保绑定客户端的更改不会导致服务在播放过程中被破坏。