我正在开发一个媒体播放器应用程序,它将使用服务在后台播放音乐,但我对与服务进行通信的所有不同方式感到困惑。我希望服务在播放时告诉活动,以便按钮可以更改为暂停。我还想要一个搜索栏,所以我需要有关服务中当前播放内容的信息。
我现在一直在看不同的例子,看起来他们每个人都是以不同的方式做事。有些是将活动绑定到服务,有些只是使用全局广播,而Android音乐播放器正在使用aidl。
就媒体播放器而言,我应该使用哪种方法?是否允许我做一些不适用于其他方法的东西?使用aidl做了什么让他们做的?
答案 0 :(得分:8)
过去几个月我的问题大致相同。这不是一个真正容易回答的问题,因为决策中有几个变量。可能,你最终会使用这些选项的组合。
问:沟通是单向的吗?只是从服务到活动?问:您是否希望其他应用程序接收您的广播? 答:如果是这样,那么你将无法使用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);
你的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);
我们最近做了一些与此非常相似的事情,并且它运作良好。我真的认为测试和使用每个选项是值得的,因为你可能会发现每个选项都是正确的选择。