2016-03-08 135 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()運行良好並修復了這個問題(我不知道爲什麼我第一次沒有得到它:這是一個綁定的服務,如果沒有連接它,它就會死掉) –

    相關問題