首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >android mediaplayer应用程序中服务和活动之间的通信

android mediaplayer应用程序中服务和活动之间的通信
EN

Stack Overflow用户
提问于 2012-07-25 10:34:27
回答 1查看 2K关注 0票数 4

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

我已经看了不同的例子有一段时间了,似乎每个人都在用不同的方式来做。一些人将活动绑定到服务上,一些人只是使用全球广播,而android音乐播放器使用的是aidl。

就媒体播放器而言,我应该使用哪种方法?会不会允许我做在其他方法上不起作用的事情?使用aidl允许他们做什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-25 12:31:37

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

问:沟通是单向的吗?仅仅从服务到活动?

答:如果是这样,那么LocalBroadcastManager就是你的朋友。我发现这是非常有用的,也是从服务到活动的最简单的通信方式之一。

问:您希望其他应用程序接收您的广播吗?

答:如果是这样的话,你将不能使用LocalBroadcastManager。您将不得不使用带有Context.sendBroadcast()的全局变量。

问:您是否希望从您的活动中与服务进行通信?

答:这个问题很棘手。如果你只需要告诉服务一些东西,并且不期望任何回报,那么你可以只使用intents。但是,如果您需要从服务中返回信息,那么您肯定会想要查看binding to that service

我发现,当绑定到您的服务时,有时我发现自己在玩等待游戏,而activity绑定到服务。因此,当时间很重要时,这可能会有一点困难。在期望与服务通信之前,您必须确保已将其绑定到服务。

给定您的示例,并假设您不期望其他应用程序接收您的广播,您可以在您的媒体播放器服务中执行类似以下操作。

代码语言:javascript
代码运行次数:0
运行
复制
Intent broadcastIntent = new Intent(PlayerService.AUDIO_PLAYING);
LocalBroadcastManager.getInstance(this).sendBroadcast(broadcastIntent);

然后,在您的玩家活动中,您需要注册为侦听器以实现此目的。可能在您的onCreate()或onStart()中。根据应用程序的不同,这可能会有所不同。

代码语言:javascript
代码运行次数:0
运行
复制
IntentFilter broadcastsToListenFor = new IntentFilter();
broadcastsToListenFor.addAction(PlayerService.AUDIO_PLAYING);
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, broadcastsToListenFor);

你的broadcastReceiver应该看起来像这样...

代码语言:javascript
代码运行次数:0
运行
复制
// 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()方法中取消您的活动接收这些广播的注册。同样,根据您的特定场景...

代码语言:javascript
代码运行次数:0
运行
复制
LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver);

我们最近做了一些非常类似的事情,而且效果很好。我真的认为测试和尝试每一个选项都是值得的,因为你可能会发现每一个选项都是正确的选择。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11641913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档