Android媒体播放器应用程序中服务和活动之间的通信

时间:2012-07-25 02:34:27

标签: java android media-player media

我正在开发一个媒体播放器应用程序,它将使用服务在后台播放音乐,但我对与服务进行通信的所有不同方式感到困惑。我希望服务在播放时告诉活动,以便按钮可以更改为暂停。我还想要一个搜索栏,所以我需要有关服务中当前播放内容的信息。

我现在一直在看不同的例子,看起来他们每个人都是以不同的方式做事。有些是将活动绑定到服务,有些只是使用全局广播,而Android音乐播放器正在使用aidl。

就媒体播放器而言,我应该使用哪种方法?是否允许我做一些不适用于其他方法的东西?使用aidl做了什么让他们做的?

1 个答案:

答案 0 :(得分:8)

过去几个月我的问题大致相同。这不是一个真正容易回答的问题,因为决策中有几个变量。可能,你最终会使用这些选项的组合。

问:沟通是单向的吗?只是从服务到活动?
答:如果是这样,那么LocalBroadcastManager就是你的朋友。我发现这非常有用,是从服务到活动进行沟通的最简单方法之一。

问:您是否希望其他应用程序接收您的广播? 答:如果是这样,那么你将无法使用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);

我们最近做了一些与此非常相似的事情,并且它运作良好。我真的认为测试和使用每个选项是值得的,因为你可能会发现每个选项都是正确的选择。