Service Broadcast简单音乐播放功能
在Activity上有两个ImageButton,分别控制播放/暂停、停止。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
start = (ImageButton) findViewById(R.id.play);
stop = (ImageButton) findViewById(R.id.stop);
start.setOnClickListener(this);
stop.setOnClickListener(this);
activityReceiver = new ActivityReceiver();//广播接收器,主要负责播放/暂停按钮图标的变换
IntentFilter filter = new IntentFilter();
filter.addAction("com.sunny.update");
registerReceiver(activityReceiver, filter);
Intent intent = new Intent(this, MyService.class);//启动服务,音乐的播放用Service控制,不会因Activity退出而停止
startService(intent);
}
其中ActivityReceiver 如下,主要负责播放/暂停按钮图标的变换,过滤接收Action为com.sunny.update的Intent:
public class ActivityReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
int update=intent.getIntExtra("update", -1);
switch(update){
case 1:
status=1;
break;
case 2:
start.setImageResource(R.drawable.pause);
status=2;
break;
case 3:
start.setImageResource(R.drawable.play);
status=3;
break;
}
}
}
为两个按钮注册时间,发送Action为com.sunny.control的广播控制音乐播放,由Service中的广播接收器接收:
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent("com.sunny.control");
switch (v.getId()) {
case R.id.play:
intent.putExtra("ACTION", 1);
sendBroadcast(intent);
break;
case R.id.stop:
intent.putExtra("ACTION", 2);
sendBroadcast(intent);
break;
}
}
在MyService中,启动时的onCreate()方法:
public void onCreate() {
// TODO Auto-generated method stub
status=1;//当前状态,1 没有声音 2正在播放 3 暂停
serviceReceiver=new ServiceReceiver();//广播接收器,控制音乐播放
IntentFilter filter=new IntentFilter();
filter.addAction("com.sunny.control");
registerReceiver(serviceReceiver, filter);
super.onCreate();
}
其中广播接收器ServiceReceiver 如下:
class ServiceReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
int action=intent.getIntExtra("ACTION", -1);//过滤Intent Action为com.sunny.control的广播,根据ACTION参数控制
switch(action){
case 1:
if(status==1){//在正在播放状态下
mp=MediaPlayer.create(context, R.raw.intro);
status=2;
Intent sendIntent=new Intent("com.sunny.update");
sendIntent.putExtra("update", 2);
sendBroadcast(sendIntent);
mp.start();
}
else if(status==2){//在暂停状态下
mp.pause();
status=3;
Intent sendIntent=new Intent("com.sunny.update");
sendIntent.putExtra("update",3);
sendBroadcast(sendIntent);
}else if(status==3){//在暂停后重新播放状态下
mp.start();
status=2;
Intent sendIntent=new Intent("com.sunny.update");
sendIntent.putExtra("update", 2);
sendBroadcast(sendIntent);
}
break;
case 2:
if(status==2||status==3){
mp.stop();
status=1;
Intent sendIntent=new Intent("com.sunny.update");
sendIntent.putExtra("update",1);
sendBroadcast(sendIntent);
}
}
}
}
最新文章
- 如何判定php环境是线程安全(TS)还是不安全(NTS)
- ABAP 数据字典中的参考表和参考字段的作用
- jsp的9大对象
- jquery ajax 序列化表单传参提交实体对象到后台action
- 面试题——设计一个程序:运行报错Stack Overflow Error
- android自动化测试中hierarchyviewer和uiautomatorviewer获取控件信息的方式比对
- chapter3:Collaborative Filtering ---------A Programmer's Guide to Data Mining
- linux开机自动启动脚本
- Aliyun EMR 集群重启
- 用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。
- Netty初体验
- 微信网页浏览器打开链接后跳转到其他浏览器下载APK文件包
- 记Weblogic部署BUG(websocket)
- JS 原型与原型链
- 使用SpringSocial开发QQ登录
- vue 使用mint-ui实现上拉加载和下拉刷新
- OGG-01028 Incompatible Record解决办法
- vue2+animate.css
- [工具]StarUML
- 沐雪多用户微信公众平台开发源码,商城小程序源码(2018年最新的asp.net C# 微信源码,小程序源码)