标签:
广播是Andorid的全局监听器,用于监听全局的广播消息。因此,它可以非常方便地实现系统中不同组件之间的通信。本例将展示通过使用BroadcastReceiver在Activity和Service之间进行通信。UI界面只管界面,并不对音乐的播放进行操作。当用户操作UI时,Activity只是改变UI,并向Service发出广播。接收到广播的Service根据广播的内容,做出相应的操作。同时,Service的状态发生改变时,也会向Activity发出广播,Activity根据广播的内容改变界面。
Activity的属性有:
String[] titleStrs = new String[]{"心愿", "约定", "美丽新世界"}; String[] authorStrs = new String[]{"未知艺术家", "周蕙", "伍佰"}; TextView title, author; Button playbt, stopbt,nextbt,previousbt; ActivityReceiver myReceiver; int status=0x11; //音乐后台状态,0x11未播放,0x12正在播放,0x13暂停中
Activity中的主要内容分为四部分:
一、获取组件界面组件ID,并注册按键的监听事件
//组件ID获取 player=new MediaPlayer(); playbt = (Button) findViewById(R.id.playbt); stopbt = (Button) findViewById(R.id.stopbt); nextbt= (Button) findViewById(R.id.nextbt); previousbt = (Button) findViewById(R.id.previousbt); title = (TextView) findViewById(R.id.musictitle); author = (TextView) findViewById(R.id.musicauthor); listView = (ListView) findViewById(R.id.musiclist); playbt.setOnClickListener(this); stopbt.setOnClickListener(this); nextbt.setOnClickListener(this); previousbt.setOnClickListener(this);
二、重写按键的监听方法
//所有button单击触发事件 @Override public void onClick(View v) { Intent intent = new Intent("com,memeda.lsy.action.CTRL_ACTION"); switch (v.getId()) { case R.id.playbt: intent.putExtra("control", 1); break; case R.id.stopbt: intent.putExtra("control", 2); break; case R.id.nextbt: intent.putExtra("control", 3); break; case R.id.previousbt: intent.putExtra("control", 4); break; } sendBroadcast(intent); }
将广播意图内容定为 "com,memeda.lsy.action.CTRL_ACTION"
根据触发点击监听事件的事件源的ID,给出不同的广播。
三、创建Activity的监听类
//所有接收广播事件处理 public class ActivityReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { int update = intent.getIntExtra("update", -1); int current = intent.getIntExtra("current", -1); if (current >= 0) { title.setText(titleStrs[current]); author.setText(authorStrs[current]); } switch (update) { case 0x11: playbt.setText("播放"); status=0x11; break; case 0x12: playbt.setText("暂停"); status=0x12; break; case 0x13: playbt.setText("播放"); status=0x13; break; } } }
提取接收广播中的update和current的数据,其中update表示当前播放器的播放状态,根据该状态,改变UI。如在播放中时,播放键应该变为暂停标志;而在暂停时播放标志为正常的播放标志。而current表示当前播放的是第几首歌,Activity需要根据它来决定UI界面上显示的歌名和作者。
四、注册广播监听者,然后开启Service后台
//注册广播接收器 myReceiver = new ActivityReceiver(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("com.memeda.lsy.UPDATE_ACTION"); registerReceiver(myReceiver, intentFilter); //开启音乐播放后台 Intent intent = new Intent(this,MusicPlay.class); startService(intent);
此处将intentFilter设为"com.memeda.lsy.UPDATE_ACTION",即后台的广播需要以这样的意图内容发出时,Activity才能监听到。
Service后台由三部分组成:
一、创建音频管理器,并为其播放完成创建监听,因为我们需要自动切歌~
MediaPlayer mediaPlayer; mediaPlayer = new MediaPlayer(); mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { current++; if(current>=3){ current=0; } Intent intent = new Intent("com.memeda.lsy.UPDATE_ACTION"); intent.putExtra("current",current); sendBroadcast(intent); prepareAndPlay(musics[current]); } });
当然某首歌播放完成时,current+1进入下一首,并发出广播通知Activity,更改UI界面的歌名显示。
二、创建Service的广播监听方法
public class MusicPlayReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { int control = intent.getIntExtra("control",-1); switch (control){ case 1: if(status==0x11){ prepareAndPlay(musics[current]); //播放Asset音乐 status=0x12; } else if(status==0x12){ mediaPlayer.pause(); status=0x13; } else if(status==0x13){ mediaPlayer.start(); status=0x12; } break; case 2: if (status==0x12 || status==0x13){ mediaPlayer.stop(); status=0x11; } break; case 3: current++; if(current>=3){ current=0; } if (status==0x11 || status==0x13){ mediaPlayer.stop(); status=0x12; prepareAndPlay(musics[current]); } else if(status==0x12){ mediaPlayer.stop(); prepareAndPlay(musics[current]); } break; case 4: if(current>0){ current--; }else current=2; if (status==0x11 || status==0x13){ mediaPlayer.stop(); status=0x12; prepareAndPlay(musics[current]); } else if(status==0x12){ mediaPlayer.stop(); prepareAndPlay(musics[current]); } break; } Intent sendIntent = new Intent("com.memeda.lsy.UPDATE_ACTION"); sendIntent.putExtra("update",status); sendIntent.putExtra("current",current); sendBroadcast(sendIntent); } }
其中case1是播放/暂停,case2是停止播放,case3是下一首,case4是上一首。Service的动作完成后,后台还需将自己的变化写成广播发往Activity通知它改变UI。
三、注册Service的监听器
musicPlayReceiver = new MusicPlayReceiver(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("com,memeda.lsy.action.CTRL_ACTION"); registerReceiver(musicPlayReceiver,intentFilter);
以上。
musicPlayReceiver = new MusicPlayReceiver(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("com,memeda.lsy.action.CTRL_ACTION"); registerReceiver(musicPlayReceiver,intentFilter);
标签:
原文地址:http://www.cnblogs.com/fishbone-lsy/p/4246818.html