我在過去幾個月裏的問題大致相同。這不是一個真正容易回答的問題,因爲這個決定有幾個變量。很可能,您最終會使用這些選項的組合。
問:溝通是單向的嗎?僅僅從服務到活動?
答:如果是這樣,那麼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);
我們最近做得非常類似於這樣的東西,它是相當不錯的了。我認爲這是值得的,因爲你可能會發現每個選項都是正確的選擇。
這意味着如果我們希望活動和遠程服務器之間的雙向通信,我們爲活動 - >服務通信編寫AIDL接口,並且我們使用Bradcastreceiver從service-> Activity進行通信。或者服務 - >活動通信可以使用AIDL來完成? – Ewoks 2013-02-18 15:26:59