2016-03-08 141 views
2

我有一个Service使用新的MediaBrowserServiceCompat与我的播放器实现进行交互。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()被调用时创建我的服务和ki当调用mediaBrowser.disconnect()时被调用。

问题是什么时候MediaSessionCompat重新创建我失去了我创建的任何元数据或我可能保存的播放状态。

它应该是这样或者我做错了吗?

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

谢谢

回答

5

正如MediaBrowserService and the modern media playback app blog提到:

这个包裹为bound services的API,这是有道理的,因为我们正在试图连接到服务。

绑定服务的生命周期是直接关系到谁绑定到服务:

当最后一个客户从服务解除绑定,系统破坏服务(除非该服务也被启动startService())。

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

Universal Android Music Player's MusicService的例子是:

  • 呼叫startService当播放停止时

该(新意图(此,MediaPlaybackService.class)当播放开始

  • 呼叫stopSelf()确保绑定客户端的更改不会导致服务在播放中被破坏

  • +0

    谢谢@ianhanniballake!调用startService()和stopSe lf()运行良好并修复了这个问题(我不知道为什么我第一次没有得到它:这是一个绑定的服务,如果没有连接它,它就会死掉) –

    相关问题