每次运行时更改都会重新创建MediaBrowserServiceCompat实例

Cha*_*bao 3 android android-support-library android-studio

我有一个Service使用new MediaBrowserServiceCompat与我的Player实现交互.

这是我的服务 onCreate()

@Override
public void onCreate() {
    super.onCreate();

    audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);

    initMediaSession();
    initMediaPlayer();

}
Run Code Online (Sandbox Code Playgroud)

和我的 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());
}
Run Code Online (Sandbox Code Playgroud)

然后我访问我MediaBrowserCompatActivity:

@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();
    }
}
Run Code Online (Sandbox Code Playgroud)

每次mediaBrowser.connect()调用时,我的服务都被创建并在mediaBrowser.disconnect()被调用时被杀死.

问题是当MediaSessionCompat重新创建时我丢失了我创建的任何元数据或者我可能保存的播放状态.

这是应该的样子还是mm我做错了?

此外,如果它应该是这样的,这是否意味着我必须在某处保存我的元数据并在MediaSessionCompat.setMetadata()每次创建新MediaSessionCompat对象时调用?还是有更有效的解决方案?

谢谢

ian*_*ake 7

正如MediaBrowserService和现代媒体播放应用博客中所述:

这包装了绑定服务的API ,这是有意义的,因为我们正在尝试连接到服务.

绑定服务的生命周期直接绑定到绑定到服务的人:

当最后一个客户端从服务解除绑定时,系统会销毁该服务(除非该服务也是由startService()启动的).

在你的情况下,服务将不再有任何绑定到它的onDestroy()和之间的onCreate().

的例子通用的Android音乐播放器的MusicService是:

  • 在播放开始时调用startService(new Intent(this,MediaPlaybackService.class))
  • 停止播放时调用stopSelf()

这可确保绑定客户端中的更改不会导致服务在回放中被销毁.