【Tech-Android-Other】设置Android中Bordercas与Service复杂通信及Media资源在系统的表

来源:互联网 发布:mathematical软件 编辑:程序博客网 时间:2024/05/16 23:46

今天写音乐播放器,要实现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中注销广播和服务,不注销的话也可以,不过会报异常。       


原创粉丝点击