2012-07-25 30 views
4

我正在研究一種媒體播放器應用程序,它將使用服務在後臺播放音樂,但我對與服務進行通信的所有不同方式感到困惑。我希望服務在播放時告訴活動,以便按鈕可以更改爲暫停。我也想要一個搜索欄,所以我需要有關服務中當前正在播放的內容的信息。服務和活動在Android媒體播放器應用程序之間的通信

我一直在尋找不同的例子一段時間,似乎每個人都在做不同的方式。有些將活動綁定到服務上,有些只使用全局廣播,而android音樂播放器則使用aidl。

就媒體播放器而言,我應該使用哪種方法?是否會允許我做其他方法無效的東西?使用aidl允許他們做什麼?

回答

8

我在過去幾個月裏的問題大致相同。這不是一個真正容易回答的問題,因爲這個決定有幾個變量。很可能,您最終會使用這些選項的組合。

問:溝通是單向的嗎?僅僅從服務到活動?
答:如果是這樣,那麼LocalBroadcastManager是你的朋友。我發現這是非常有用的,也是從服務到活動溝通的最簡單方法之一。

問:您是否期望其他應用程序接收您的廣播?
答:如果是這樣,那麼您將無法使用LocalBroadcastManager。你必須用Context.sendBroadcast()來代替全局。

問:您是否期望通過您的活動回饋服務?
答:這個很棘手。如果你只需要告訴服務的東西,不要期望任何回報,那麼你可以使用意圖。但是,如果您需要從服務中獲得信息,那麼您一定要考慮binding to that service

我發現,當綁定到您的服務時,我有時會發現自己在等待遊戲,而活動綁定到服務。所以,當時間很重要時,這可能會有點困難。您必須努力確保在您期望與之通信之前,您已經熟悉了該服務。

給出你的例子,並假設你不希望其他應用程序接收你的廣播,你可以在你的媒體播放服務中做如下的事情。

Intent broadcastIntent = new Intent(PlayerService.AUDIO_PLAYING); 
LocalBroadcastManager.getInstance(this).sendBroadcast(broadcastIntent); 

然後,在您的播放器活動中,您需要註冊爲此意圖的監聽器。也許在你的onCreate()或onStart()。這可以根據您的應用程序而變化。

IntentFilter broadcastsToListenFor = new IntentFilter(); 
broadcastsToListenFor.addAction(PlayerService.AUDIO_PLAYING); 
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, broadcastsToListenFor); 

你的廣播接收器會是這個樣子......

// Set up broadcast receiver 
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { 

    @Override 
    public synchronized void onReceive(Context context, Intent intent) { 

     if(action.equals(PlayerService.AUDIO_PLAYING)) { 

      // Set your play button image to pause here 
     } 
    } 
}; 

最後,確保你從的onStop()或在onPause()方法接收這些廣播註銷您的活動。同樣,根據您的具體情況......

LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver); 

我們最近做得非常類似於這樣的東西,它是相當不錯的了。我認爲這是值得的,因爲你可能會發現每個選項都是正確的選擇。

+0

這意味着如果我們希望活動和遠程服務器之間的雙向通信,我們爲活動 - >服務通信編寫AIDL接口,並且我們使用Bradcastreceiver從service-> Activity進行通信。或者服務 - >活動通信可以使用AIDL來完成? – Ewoks 2013-02-18 15:26:59

相關問題