在安卓音乐播放器应用中,服务和活动之间的通信。

4
我正在开发一个媒体播放器应用,将使用服务在后台播放音乐,但我对与服务进行通信的不同方式感到困惑。我希望服务在播放时告诉活动,以便按钮可以变为暂停状态。 我还需要有一个滑动条,因此我需要关于服务中当前播放内容的信息。
我已经看了很多不同的示例,似乎每个示例都在以不同的方式实现。有些绑定活动到服务上,有些只使用全局广播,而Android音乐播放器则使用AIDL。
就媒体播放器而言,我应该使用哪种方法呢?其中一种方法会允许我执行另一种方法无法执行的操作吗?使用AIDL允许他们做什么呢?
1个回答

8
在过去的几个月里,我遇到了大致相同的问题。这不是一个很容易回答的问题,因为有几个决定因素。可能情况下,你最终会使用多种选择的组合。
问:通信是单向的吗?只从服务到活动?如果是这样的话,那么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);

您的广播接收器应该类似于以下内容...
// 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接口,并使用BroadcastReceiver从服务->活动进行通信?或者也可以使用AIDL来实现服务->活动的通信吗? - Ewoks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接