今天写音乐播放器,要实现Activity与Service之间通信。也发现Music是放在系统的表中的,查看系统的MediaStore.Audio.Media.EXTERNAL_CONTENT_URI的表可以得到以下信息:(存储Media信息的表会在放入Media资源的时候再自动加入Media信息到表中)
这里主要是展示在SDcard中的Media资源表:
由这个表可以得到完整的Media信息。
讲到Activity与Service通信了。
首先建立activtiyA 和activityB
然后建立Service;
在A,B.的页面都注册一个广播,两个页面的广播都是set一样的Action,只要在Serivce 发送这个Action的 广播的话,两个页面都可以接受广播了。
private void resignerServiceBrocase(){
actBrodercast= new MainActBrodercast();
IntentFilter filter=new IntentFilter();
filter.addAction(“updataallAct”);
registerReceiver(actBrodercast, filter);
}
再在Service注册一个广播,用来接受Activity发来的广播。当Actictiy发来的信息比较多比较乱的时候,我们在Service中广播接收处理就比较不好整理,这里我们可以模拟网页请求方式。
我们可以在Service中定义:
public final static String REQUESTCODE = "request";// 请求码
public final static int REQUEST_PLAY = 1;// 请求码值
public final static int REQUEST_STOP = -1;// 请求码值
public final static int REQUEST_PUASE = 0;// 请求码值
public final static String REQUESTCONTENT = "requestcontent";// 请求附带的内容
public final static String RESULTCODE = "music_state";// 结果码
public final static int MUSICSTATE_ISPLAY = 1;// 结果码值
public final static int MUSICSTATE_STOP = -1;// 结果码值
public final static int MUSICSTATE_PUASE = 0;// 结果码值
public final static String RESULTCONTENT = "requestcontent";// 结果附带的内容 主要是Musicsong
这样我们的Service在接受广播时候,可以先判断请求码,在获取请求内容,再处理下一步。(暂时不知道这个方法对后期操作有多大的影响,目前这样处理的话,各种广播请求可以清晰地进行处理了)
同样地,我们在Service发送结果广播的时候也可以先加入结果码,再让Activity根据结果码得到内容,对页面进行更新。
例如Service中:
/**
* 接受广播
*/
public class ServiceBrocase extends BroadcastReceiver {
public ServiceBrocase() {
}
@Override
public void onReceive(Context context, Intent intent) {
Log.i(MusicPlayerService.TAG, "Servicer.接受了广播");
int requestcode = intent.getIntExtra(
MusicPlayerService.REQUESTCODE, -1);
switch (requestcode) {
// 请求播放 带这个displayname 就是文件名进来
case MusicPlayerService.REQUEST_PLAY:
String music_displayname = intent
.getStringExtra(MusicPlayerService.REQUESTCONTENT);
playfromhead(music_displayname);
break;
// 请求暂停
case MusicPlayerService.REQUEST_PUASE:
//把mediaplayer停了 记录暂停时的位置
break;
// 请求停止复位
case MusicPlayerService.REQUEST_STOP:
break;
}
}
}
同理可以知道再Activity中可以同样的处理,
不过处理页面的时候要使用handler,记得哦~!
不知道还有其他更好的方法处理广播消息不?(求赐教)
关于注册广播和Service的时机:
1.我在我的App 的TopActivity中启动Service:startServic(intent);
2.然后在onStart()中 bindServic 和注册广播。 这样可以让页面每次切换回来都可以bindServic和接受广播。
3.在onPause中注销广播和服务,不注销的话也可以,不过会报异常。