yuk*_*0ex 4 java media android media-player
我正在开发一个媒体播放器应用程序,它将使用服务在后台播放音乐,但我对与服务进行通信的所有不同方式感到困惑.我希望服务在播放时告诉活动,以便按钮可以更改为暂停.我还想要一个搜索栏,所以我需要有关该服务当前播放内容的信息.
我一直在寻找不同的例子,看起来每个人都以不同的方式做这件事.有些是将活动绑定到服务,有些只是使用全局广播,而Android音乐播放器正在使用aidl.
就媒体播放器而言,我应该使用哪种方法?是否允许我做一些不适用于其他方法的东西?使用aidl做了什么让他们做的?
小智 8
在过去的几个月里,我的问题大致相同.这不是一个真正容易回答的问题,因为决策中有几个变量.可能,你最终会使用这些选项的组合.
问:沟通是单向的吗?从服务到活动?
答:如果是这样,那么LocalBroadcastManager就是你的朋友.我发现这是非常有用的,也是从服务到活动进行通信的最简单方法之一.
问:您是否希望其他应用程序接收您的广播?
答:如果是这样,那么你将无法使用LocalBroadcastManager.您必须使用Context.sendBroadcast()来使用全局的.
问:您是否希望通过活动与服务进行沟通?
答:这个很棘手.如果你只需要告诉服务一些东西并且不期待任何回报,那么你可以使用意图.但是,如果您需要从服务中获取信息,那么您肯定希望查看对该服务的绑定.
我发现,当绑定到您的服务时,我有时会发现自己正在等待游戏,而活动会绑定到服务.因此,当时间很重要时,这可能有点困难.在您希望与服务进行通信之前,您必须努力确保您已经很好地使用该服务.
根据您的示例并假设您不希望其他应用程序接收您的广播,您可以在媒体播放器服务中执行以下操作.
Intent broadcastIntent = new Intent(PlayerService.AUDIO_PLAYING);
LocalBroadcastManager.getInstance(this).sendBroadcast(broadcastIntent);
Run Code Online (Sandbox Code Playgroud)
然后,在您的玩家活动中,您需要注册为此意图的倾听者.也许在你的onCreate()或onStart()中.这取决于您的应用程序.
IntentFilter broadcastsToListenFor = new IntentFilter();
broadcastsToListenFor.addAction(PlayerService.AUDIO_PLAYING);
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, broadcastsToListenFor);
Run Code Online (Sandbox Code Playgroud)
你的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
}
}
};
Run Code Online (Sandbox Code Playgroud)
最后,请确保取消注册您的活动,以便在onStop()或onPause()方法中接收这些广播.再次,取决于您的具体情况......
LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver);
Run Code Online (Sandbox Code Playgroud)
我们最近做了一些与此非常相似的事情,并且工作得非常好.我真的认为测试和使用每个选项是值得的,因为你可能会发现每个选项都是正确的选择.
| 归档时间: |
|
| 查看次数: |
1860 次 |
| 最近记录: |