安卓 实现网易云音乐底部播放栏效果之使用自定义BaseActivity实现 下

上一篇文章中,我们已经把BaseActivity建立好了,现在我们要考虑的是什么呢。

由于音乐播放,所以我们需要用到Service,那么自然就需要用Service对UI界面(也就是我们的播放界面进行更新),相对的,我们的Activity也会给Service发送诸如播放,停止,暂停,下一首之类的信息。这就涉及到了Service与Activity之间的通信。

在网上了解了一番,一般有下面的几种方法:具体可以参考这篇博客Service与Activity之间通讯的几种方式,我觉得写的很好,我下面粗略提及一下

Service向Activity发送消息:

1.通过Broadcast,在活动中注册广播接收器,在Service中发送广播,Activity中接收。

2.通过Handler,在活动中写Handler,在Service中调用活动中的Handler来向Handler传递消息。

Activity向Service发送消息:

1.通过BindService绑定服务的方式开启服务,接受到服务连接对象,也就是桥,这个桥可以让Service中的方法公开给这个Activity。通过绑定对象就可以直接访问到服务里的方法从而传输数据。

2.通过Intent打开服务的方式传送数据。

3.通过Broadcast广播传送,在服务中注册广播接收器,在活动中发出消息,在服务中接收。

正题: 

一.这里Service向Activity传递消息使用广播的方式:

定义广播Action:

/**
	 * 音乐服务广播动作字符串
	 */
	public final static String MusicServiceReceiverAction = "winter.zxb.smilesb101.winterMusic.service.receiver";//这里的动作可以自定义,只要区别不同的广播以及接收端和发送端相同的Action


1.首先在需要接受消息的Activity中新建广播接收器:

/**
	 *  广播接收器
	 * Created by SmileSB101 on 2016/10/19 0019.
	 */
	public class UI_Receiver extends BroadcastReceiver{
		@Override
		public void onReceive(Context context,Intent intent){
			int type = intent.getIntExtra(MusicServices.BROADCAST.TYPE_TYPENAME,-2);
			int value = 0;
			//Log.i("收到消息",type+"");
			switch(type)
			{
				//这里进行消息对应处理
			}
		}
	}

2.在活动的onCreat()方法中注册广播:

IntentFilter intentFilter = new IntentFilter();
ui_receiver = new UI_Receiver();
		intentFilter.addAction(MusicServices.MusicServiceReceiverAction);
		//注册应用内广播接收器,为了不让其他应用接收到广播
		localBroadcastManager = LocalBroadcastManager.getInstance(this);
		localBroadcastManager.registerReceiver(ui_receiver, intentFilter);


3.服务中注册广播,在onCreate()方法中:

//初始化广播
			musicServicesBroadcastReceiver = new MusicServicesBroadcastReceiver();
			IntentFilter intentFilter = new IntentFilter();
			intentFilter.addAction(MusicServiceReceiverAction);
			//本地广播注册
			localBroadcastManager = LocalBroadcastManager.getInstance(this);
			localBroadcastManager.registerReceiver(musicServicesBroadcastReceiver,intentFilter);

4.发送数据的方法:

Intent intent = new Intent(MusicServiceReceiverAction);
			int value = 0;//这里需要传入什么就写什么
			intent.putExtra("key",value);//这里的key是键值对的键,在后面的取值时需要用到,自定义,
			localBroadcastManager.sendBroadcast(intent);//发送广播
5.还要注意一点我们需要在onDestory()方法中取消广播的注册

//取消注册应用内广播接收器
		localBroadcastManager.unregisterReceiver(ui_receiver);


这样就完成了Service向Activity数据的传递;

二.Activity向Service传递数据,这里使用绑定开启服务的方式

1.在Activity中建立桥梁(ServiceConnection),以及Service绑定对象:

/**
	 * 音乐服务Bind对象
	 */
	public static MusicServices.MusicIBind musicIBind;
	/**
	 * 服务连接对象
	 */
	public ServiceConnection mServiceConnection = new ServiceConnection() {

		@Override
		public void onServiceConnected(ComponentName name,IBinder service) {
			//绑定成功后,取得MusicSercice提供的接口
			musicIBind = (MusicServices.MusicIBind) service;
		}

		@Override
		public void onServiceDisconnected(ComponentName name) {
		}
	};

2.在Activity需要调用的地方直接使用绑定对象即可:

比如在服务中有playMusic()方法,那么调用方式就是musicIBind.playMusic()即可。

3.还有一点就是要在onDestory()方法中取消服务的绑定:

//取消服务绑定
		unbindService(mServiceConnection);

这样就实现了活动与服务的数据交流。是不是很简单。如有问题,欢迎指正。




  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值