gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:06:06 25 4
gpt4 key购买 nike

我正在开发一个媒体播放器应用程序,该应用程序将使用服务在后台播放音乐,但我对与该服务进行通信的所有不同方式感到困惑。我希望服务在播放时告知 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com