我正在开发一个媒体播放器应用程序,它将使用服务在后台播放音乐,但我对与服务进行通信的所有不同方式感到困惑。我想让服务在活动播放时通知它,这样按钮就可以更改为暂停。我还想要一个搜索栏,所以我需要关于当前正在播放的服务的信息。
我已经看了不同的例子有一段时间了,似乎每个人都在用不同的方式来做。一些人将活动绑定到服务上,一些人只是使用全球广播,而android音乐播放器使用的是aidl。
就媒体播放器而言,我应该使用哪种方法?会不会允许我做在其他方法上不起作用的事情?使用aidl允许他们做什么?
发布于 2012-07-25 04:31:37
在过去的几个月里,我遇到了大致相同的问题。这不是一个真正容易回答的问题,因为有几个变量会影响决策。很可能,您最终会使用这些选项的组合。
问:沟通是单向的吗?仅仅从服务到活动?
答:如果是这样,那么LocalBroadcastManager就是你的朋友。我发现这是非常有用的,也是从服务到活动的最简单的通信方式之一。
问:您希望其他应用程序接收您的广播吗?
答:如果是这样的话,你将不能使用LocalBroadcastManager。您将不得不使用带有Context.sendBroadcast()的全局变量。
问:您是否希望从您的活动中与服务进行通信?
答:这个问题很棘手。如果你只需要告诉服务一些东西,并且不期望任何回报,那么你可以只使用intents。但是,如果您需要从服务中返回信息,那么您肯定会想要查看binding to that service。
我发现,当绑定到您的服务时,有时我发现自己在玩等待游戏,而activity绑定到服务。因此,当时间很重要时,这可能会有一点困难。在期望与服务通信之前,您必须确保已将其绑定到服务。
给定您的示例,并假设您不期望其他应用程序接收您的广播,您可以在您的媒体播放器服务中执行类似以下操作。
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);
你的broadcastReceiver应该看起来像这样...
// 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);
我们最近做了一些非常类似的事情,而且效果很好。我真的认为测试和尝试每一个选项都是值得的,因为你可能会发现每一个选项都是正确的选择。
https://stackoverflow.com/questions/11641913
复制相似问题