Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java android mediaplayer应用程序中服务和活动之间的通信_Java_Android_Media Player_Media - Fatal编程技术网

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

Java android mediaplayer应用程序中服务和活动之间的通信,java,android,media-player,media,Java,Android,Media Player,Media,我正在开发一个媒体播放器应用程序,它将使用一项服务在后台播放音乐,但我对与该服务进行通信的所有不同方式感到困惑。我希望服务在播放时告知活动,以便按钮可以更改为暂停。我还想要一个搜索栏,所以我需要关于服务中当前正在播放的内容的信息 我已经看了一段时间不同的例子,似乎每个人都在用不同的方式做。一些人将活动绑定到服务,一些人只使用全球广播,android音乐播放器使用aidl 就媒体播放器而言,我应该使用哪种方法?一个会允许我做其他方法无法做的事情吗?使用aidl允许他们做什么 在过去几个月里,我遇到

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

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


就媒体播放器而言,我应该使用哪种方法?一个会允许我做其他方法无法做的事情吗?使用aidl允许他们做什么

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

问:沟通是一种方式吗?从服务到活动?
A:如果是的话,那他就是你的朋友。我发现这非常有用,是从服务到活动进行沟通的最简单方式之一

问:您希望其他应用程序接收您的广播吗?
答:如果是这样,那么您将无法使用LocalBroadcastManager。您必须将全局设置与Context.sendBroadcast()一起使用

问:您是否希望通过您的活动与服务部门进行沟通?
A:这个很棘手。如果您只需要告诉服务一些事情,而不希望得到任何回报,那么您可以使用intent。但是,如果您需要从服务中获得信息,那么您肯定会希望进行调查

我发现,当绑定到您的服务时,我有时会发现自己在等待,而活动绑定到服务。所以,当时间很重要时,这可能有点困难。在期望与服务进行通信之前,您必须确保已很好地绑定到该服务

根据您的示例,假设您不希望其他应用程序接收您的广播,您可以在media player服务中执行以下操作

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接口,并使用Bradcastreceiver从服务->活动进行通信?或者也可以使用AIDL进行服务->活动通信?