在过去的几个月里,我遇到了大致相同的问题。这不是一个很容易回答的问题,因为有几个决定因素。可能情况下,你最终会使用多种选择的组合。
问:通信是单向的吗?只从服务到活动?如果是这样的话,那么
LocalBroadcastManager就是你的好朋友。我发现这非常有用,也是从服务到活动通信的最简单方法。
问:你是否希望其他应用程序接收你的广播?如果是这样,你将无法使用LocalBroadcastManager。你需要使用Context.sendBroadcast()来代替全局广播。
问:你是否希望从活动中与服务进行双向通信?这有点棘手。如果你只是需要告诉服务一些内容,并不需要得到任何反馈,那么你可以使用意图(intents)。但是,如果你需要从服务中获得信息,则肯定要研究
绑定到该服务。
我发现当我绑定到服务时,有时候我会玩一个等待游戏,而活动则会绑定到服务。因此,在时间很重要的情况下,这可能有点困难。你必须确保在期望与服务通信之前,已经成功地绑定到该服务。
根据你的示例,假设你不希望其他应用程序接收你的广播,则可以在媒体播放器服务中执行以下操作。
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)
您的广播接收器应该类似于以下内容...
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public synchronized void onReceive(Context context, Intent intent) {
if(action.equals(PlayerService.AUDIO_PLAYING)) {
}
}
};
最后,请确保在onStop()或onPause()方法中取消注册接收这些广播的活动。根据您特定的情况,可能需要采取不同的措施...
LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver);
我们最近也做了类似的事情,效果还不错。我认为值得测试和尝试每个选项,因为你可能会发现在某种情况下它们都是正确的选择。