安卓 实现网易云音乐底部播放栏效果之使用自定义BaseActivity实现 下
2016-10-21 10:04
387 查看
上一篇文章中,我们已经把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();
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);
这样就实现了活动与服务的数据交流。是不是很简单。如有问题,欢迎指正。
由于音乐播放,所以我们需要用到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);
这样就实现了活动与服务的数据交流。是不是很简单。如有问题,欢迎指正。
相关文章推荐
- 安卓 实现网易云音乐底部播放栏效果之使用自定义BaseActivity实现 上
- 安卓 实现网易云音乐底部播放栏效果之使用UI绑定到Service上实现
- 【Android】安卓开发实战之使用Fragment(碎片)实现底部导航栏效果
- 安卓开发:弹出自定义对话框自动播放视频(仿视频广告效果,使用mediaplayer和surfaceview做播放器)
- WPF技术触屏上的应用系列(三): 视频播放器的使用及视频播放、播放、暂停、可拖动播放进度效果实现
- 60、实例 使用jQuery实现自定义动画效果
- 两种方法使用js读写cookie实现一个底部广告浮层效果
- 两种方法使用js读写cookie实现一个底部广告浮层效果
- 滑动菜单解决方案之三:使用TabHost控件实现微信界面的底部菜单效果
- [一个星期自学安卓]使用Gallery实现立体翻页效果
- 【安卓笔记】使用ViewPager+Fragment实现选项卡切换效果
- 使用WPF的自定义InkCanvas实现毛笔效果
- 安卓经典效果组件篇6——自定义底部Tab控件
- android progressbar 使用自定义图片时的左右两端圆角效果实现
- WPF技术触屏上的应用系列(三): 视频播放器的使用及视频播放、播放、暂停、可拖动播放进度效果实现
- 安卓开发20:动画之Animation 详细使用-主要通过java代码实现动画效果
- Android 开发之网易云音乐(或QQ音乐)的播放界面转盘和自定义SeekBar的实现
- android使用ViewPager实现底部菜单栏和左右滑动效果,加载多个Activity
- Viewpager和fragment和自定义的底部Tab实现切换效果
- Android提高篇之自定义dialog实现processDialog“正在加载”效果、使用Animation实现图片旋转