java - android mediaplayer 应用程序中服务和 Activity 之间的通信

标签 java android media-player media

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

一段时间以来,我一直在研究不同的例子,似乎每个人都以不同的方式来做这件事。有些是将 Activity 绑定(bind)到服务,有些只是使用全局广播,而 android 音乐播放器正在使用 aidl。

就媒体播放器而言,我应该使用哪种方法?有人会允许我做一些对其他方法不起作用的事情吗?使用 aidl 可以让他们做什么?

最佳答案

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

问:沟通是单向的吗?只是从服务到 Activity ?
A:如果是这样,那么LocalBroadcastManager是你的 friend 。我发现这非常有用,并且是从服务到 Activity 进行通信的最简单方法之一。

问:你希望其他应用能收到你的广播吗?
A:如果是这样,那么您将无法使用 LocalBroadcastManager。您必须将全局的与 Context.sendBroadcast() 结合使用。

问:您是否希望通过您的 Activity 与服务进行通信?
A:这个很棘手。如果您只需要告诉服务一些事情而不期望任何返回,那么您可以只使用 Intent 。但是,如果您需要从该服务返回信息,那么您一定要查看 binding to that service .

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

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

Intent broadcastIntent = new Intent(PlayerService.AUDIO_PLAYING);
LocalBroadcastManager.getInstance(this).sendBroadcast(broadcastIntent);

然后,在您的播放器 Activity 中,您需要注册为该 Intent 的监听器。也许在您的 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() 方法中取消注册您的 Activity 以接收这些广播。同样,取决于您的具体情况...

LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver);

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

关于java - android mediaplayer 应用程序中服务和 Activity 之间的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11641913/

相关文章:

java - 使用 Vaadin 和 Spring Security 时出现 403 CSRF token 错误

CameraPreview 和 GoogleMaps API v2 View 之间的 Android SurfaceView 冲突

android - 具有 kotlin 库依赖性的 Flutter 应用程序中的 NoClassDefFoundError

JavaFX 音频似乎没有播放

java - SoundPool 和 MediaPlayer 中的并发性?

java - 无法从共享 lib 文件夹动态加载 java 类

java - 在 Java 中传递类 ("Country.class") 作为参数

android - 在Android应用程序中添加静音按钮?

java - @Singleton @ApplicationScoped bean 中的 Lucene IndexWriters 关闭 IndexWriter

android - Geocoder 在真实设备上返回空列表