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