Android实战 - 音心播放器 (通知实现音乐的播放/暂停/下一曲控制)
1.背景
通知 -> Service :
上一篇的MusicService 中提高了通知是Service的前台显示,这篇将介绍通知(MusicNotification).通知在这里有四个作用:
(1)显示当前音乐的信息
(2)播放/暂停音乐
(3)下一曲播放音乐
(4)关闭通知栏(实际上也是停止音乐播放并关闭Service)
Service -> 通知 :
通知和Service是紧密相连的,当Service结束的时候,取消通知;当Service启动的时候,初始化通知/创建通知;当音乐状态发生改变的时候,更新通知;如下图所示 :
2.通知实现
在这里单独的将通知单独的类中,方便使用;没有使用到通知的震动提醒/铃声提醒/闪光灯提醒,如果需要使用,可以看博客 :
Android-Notification (通知实现).
(1)通知布局实现
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="60dp" ><ImageViewandroid:id="@+id/iv_notification_logo"android:layout_width="60dp"android:layout_height="match_parent"android:layout_alignParentLeft="true"android:layout_margin="5dp"android:src="@drawable/logo" /><TextViewandroid:id="@+id/tv_nofitication_singname"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="5dp"android:layout_toRightOf="@+id/iv_notification_logo"android:maxLines="1"android:textSize="12sp"android:text="@string/item_notification_singname"android:textColor="@color/text_color_whrit" /><TextViewandroid:id="@+id/tv_nofitication_singer"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_marginBottom="10dp"android:textSize="10sp"android:layout_toRightOf="@+id/iv_notification_logo"android:text="@string/item_notifiaction_singer"android:textColor="@color/bg_color" /><ImageViewandroid:id="@+id/iv_nofitication_kzhi_play"android:layout_width="40dp"android:layout_height="40dp"android:layout_marginTop="20dp"android:layout_marginBottom="10dp"android:layout_toLeftOf="@+id/iv_nofitication_kzhi_next"android:src="@android:drawable/ic_media_play" /><ImageViewandroid:id="@+id/iv_nofitication_kzhi_next"android:layout_width="40dp"android:layout_height="40dp"android:layout_marginTop="20dp"android:layout_marginBottom="10dp"android:layout_toLeftOf="@+id/iv_nofitication_kzhi_colse"android:src="@android:drawable/ic_media_next" /><ImageViewandroid:id="@+id/iv_nofitication_kzhi_colse"android:layout_width="30dp"android:layout_height="30dp"android:layout_alignParentRight="true"android:layout_marginTop="20dp"android:layout_marginBottom="10dp"android:layout_marginRight="10dp"android:layout_marginLeft="10dp"android:src="@android:drawable/ic_menu_close_clear_cancel"android:textColor="@color/text_color_main" /></RelativeLayout>
效果 :
(2)代码实现
说明: 1)通知的实现是单例模式实现(恶汉式)(
设计模式之单例模式(Singleton pattern)
);
2)通知中通过使用RemoteViews ,进行自定义布局实现;
3)通过PendingIntent来封装响应点击事件的Intent ;
4)第3条中的Intent,经过测试,只能每个响应事件,填充参数的Intent,只能对应一个点击事件 , 否则是得不到Intent中的参数的。但如果不需要区分的话,一个Intent就可以实现点击事件的响应;
5)通过PendingInetnt.getBroadcast() 方法来通知MusicService,进行响应事件的本质作用;
6)广播:如果MusicService想要接收到通知来的点击事件,那么需要在MusicServiceBroadcast中 注册(IntentFiliter/addAction(xxx)),同时通知中的Inent需 要setAction(xxx), xxx 要一样;
实现的通知源码分享 :
package cn.labelnet.framework;import com.android.volley.toolbox.ImageLoader.ImageListener;import android.R.anim;
import android.annotation.SuppressLint;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Build;
import android.widget.RemoteViews;
import cn.labelnet.maskmusic.R;
import cn.labelnet.model.MusicModel;
import cn.labelnet.net.VolleyHttpRequest;public class MusicNotification extends Notification {/*** Music播放控制 的 Notification * 动态的显示后台的MusicService的前台展示*//*** 恶汉式实现单例模式加载*/private static MusicNotification notifyInstance = null;// 通知idprivate final int NOTIFICATION_ID = 10001;// 通知private Notification musicNotifi = null;// 管理通知private NotificationManager manager = null;// 界面实现private Builder builder = null;// 上下文private Context context;// 布局private RemoteViews remoteViews;private final int REQUEST_CODE = 30000;// 给Service 发送广播private final String MUSIC_NOTIFICATION_ACTION_PLAY = "musicnotificaion.To.PLAY";private final String MUSIC_NOTIFICATION_ACTION_NEXT = "musicnotificaion.To.NEXT";private final String MUSIC_NOTIFICATION_ACTION_CLOSE = "musicnotificaion.To.CLOSE";private final String MUSIC_NOTIFICAION_INTENT_KEY = "type";private final int MUSIC_NOTIFICATION_VALUE_PLAY = 30001;private final int MUSIC_NOTIFICATION_VALUE_NEXT = 30002;private final int MUSIC_NOTIFICATION_VALUE_CLOSE =30003;private Intent play=null,next=null,close = null;private PendingIntent musicPendIntent = null;// 给进度条页面广播// 待实现// 网络 : 加载图片实现private ImageListener imageListener = null;public void setManager(NotificationManager manager) {this.manager = manager;}public void setContext(Context context) {this.context = context;}private MusicNotification() {// 初始化操作remoteViews = new RemoteViews("cn.labelnet.maskmusic",R.layout.list_item_notification);builder = new Builder(context);// 初始化控制的Intentplay = new Intent();play.setAction(MUSIC_NOTIFICATION_ACTION_PLAY);next = new Intent();next.setAction(MUSIC_NOTIFICATION_ACTION_NEXT);close = new Intent();close.setAction(MUSIC_NOTIFICATION_ACTION_CLOSE);}/*** 恶汉式实现 通知* * @return*/public static MusicNotification getMusicNotification() {if (notifyInstance == null) {notifyInstance = new MusicNotification();}return notifyInstance;}/*** 创建通知* 初始化通知*/@SuppressLint("NewApi")public void onCreateMusicNotifi() {// 设置点击事件// 1.注册控制点击事件play.putExtra("type",MUSIC_NOTIFICATION_VALUE_PLAY);PendingIntent pplay = PendingIntent.getBroadcast(context, REQUEST_CODE,play, NOTIFICATION_ID);remoteViews.setOnClickPendingIntent(R.id.iv_nofitication_kzhi_play,pplay);// 2.注册下一首点击事件next.putExtra("type",MUSIC_NOTIFICATION_VALUE_NEXT);PendingIntent pnext = PendingIntent.getBroadcast(context, REQUEST_CODE,next, NOTIFICATION_ID);remoteViews.setOnClickPendingIntent(R.id.iv_nofitication_kzhi_next,pnext);// 3.注册关闭点击事件close.putExtra("type",MUSIC_NOTIFICATION_VALUE_CLOSE);PendingIntent pclose = PendingIntent.getBroadcast(context, REQUEST_CODE,close, NOTIFICATION_ID);remoteViews.setOnClickPendingIntent(R.id.iv_nofitication_kzhi_colse,pclose);builder.setContent(remoteViews).setWhen(System.currentTimeMillis())// 通知产生的时间,会在通知信息里显示
// .setPriority(Notification.PRIORITY_DEFAULT)// 设置该通知优先级.setOngoing(true).setTicker("播放新的一首歌").setSmallIcon(R.drawable.logo);// 兼容性实现musicNotifi = builder.getNotification();
// if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
// musicNotifi = builder.getNotification();
// } else {
// musicNotifi = builder.build();
// }musicNotifi.flags = Notification.FLAG_ONGOING_EVENT;manager.notify(NOTIFICATION_ID, musicNotifi);}/*** 更新通知*/public void onUpdataMusicNotifi(MusicModel mm, boolean isplay) {// 设置添加内容remoteViews.setTextViewText(R.id.tv_nofitication_singname,(mm.getSongname()!=null?mm.getSongname():"什么东东") + "");remoteViews.setTextViewText(R.id.tv_nofitication_singer,(mm.getSingername()!=null?mm.getSingername():"未知") + "");//判断是否播放if (isplay) {remoteViews.setImageViewResource(R.id.iv_nofitication_kzhi_play,android.R.drawable.ic_media_pause);} else {remoteViews.setImageViewResource(R.id.iv_nofitication_kzhi_play,android.R.drawable.ic_media_play);}onCreateMusicNotifi();}/*** 取消通知栏*/public void onCancelMusicNotifi(){manager.cancel(NOTIFICATION_ID);}}
(3)广播的基本使用图解
3.总结
Android实战 - 音心播放器 (Music Service 实现);
Android实战 - 音心播放器 (通知实现音乐的播放/暂停/下一曲控制)相关推荐
- Android实战 - 音心播放器 (MusicListActivity - 音乐播放和MainActivity的一个问题)
1.背景 在上篇中实现了分类信息音乐列表的实现,包括页面和设计与实现,在此实现数据的请求和解决一个问题! 1)网络数据请求 2)优化点击事件 3)一个bug修复 2.网络数据请求 里面的数据还是接口上 ...
- Android实战 - 音心音乐播发器 (主界面实现)
开发平台 : eclipse , ubuntu ,android sdk 4.0+ 1.背景 主页的设计从上往下依次是滚动广告(ViewFlipper ),分类信息( GridView ),热门榜单 ...
- android图片本地播放器下载,安卓音乐照片播放器
音乐照片播放器app是一个给力的图像工具,可以提供非常好用的幻灯片播放功能,同时还有超级享受的相册图库应用功能,音乐照片播放器app在西西软件园下载之后,你绝对不会后悔的. 功能介绍 用户通过软件可以 ...
- android 播放mp3 倒计时,Android实战 - 音心播放器 (MusicActivity - 倒计时 ,进度条实现)...
1.背景 还是音乐播放界面,实现倒计时和进度条功能,基本实现过程: 当打开MusicActivity 的时候,MusicService会发送广播给MusicActivity ,后开始当前播放的时间进度 ...
- android倒计时水平进度条,Android实战 - 音心播放器 (MusicActivity - 倒计时 ,进度条实现)...
1.背景 还是音乐播放界面,实现倒计时和进度条功能,基本实现过程: 当打开MusicActivity 的时候,MusicService会发送广播给MusicActivity ,后开始当前播放的时间进度 ...
- Android 中封装优雅的 MediaPlayer 音频播放器,支持多个播放器
Android 中封装优雅的 MediaPlayer 音频播放器,支持多个播放器实例的示例: public class AudioPlayer implements MediaPlayer.OnPre ...
- Android开发本地及网络Mp3音乐播放器(十三)网络音乐搜索功能实现,歌名歌手专辑名搜索
转载请注明出处:http://blog.csdn.net/iwanghang/article/details/51298411 觉得博文有用,请点赞,请留言,请关注,谢谢!~ 实现功能: 实现网络音乐 ...
- 使用Vitamio打造自己的Android万能播放器(7)——在线播放(下载视频)
前言 本章将实现非常实用的功能--下载在线视频.涉及到多线程.线程更新UI等技术,还需思考产品的设计,如何将新加的功能更好的融入到现有的产品中,并不是简单的加一个界面就行了,欢迎大家交流产品设计和技术 ...
- [转载]使用Vitamio打造自己的Android万能播放器(7)——在线播放(下载视频)...
前言 本章将实现非常实用的功能--下载在线视频.涉及到多线程.线程更新UI等技术,还需思考产品的设计,如何将新加的功能更好的融入到现有的产品中,并不是简单的加一个界面就行了,欢迎大家交流产品设计和技术 ...
最新文章
- 未来二十年的AI科研应当往何处发展?AAAI给出了一份答案
- unix mysql_Unix和Mysql中列出的数据库大小之间存在差异
- 背包问题九讲 v1.0
- C++primer第九章 顺序容器 9.3 顺序容器操作
- SpriteBuilder物理对象的父子关系
- STM32 的RAM跑到哪里去了
- eureka hostname作用_springcloud使用Eureka实现服务治理替代dubbo加zookeeper
- 用好IE9浏览器必须要知道的九件事
- Laravel服务容器
- Unity sendmessage发送多个参数
- JAVA 阶乘 n!
- 程序设计c语言答案pdf,C语言程序设计习题解答.pdf
- 怎么用计算机同步文件夹,DSynchronize同步电脑本地文件夹教程
- 安装vbb的一些经验(包括mysql,apache)
- 快递单中抽取关键信息【一】----基于BiGRU+CR+预训练的词向量优化
- 战争游戏红龙mod简介
- maximum.accumulate函数及ndarray和list比较
- 利用QVOD架设流媒体服务器/电影服务器/vod服务器
- teamview+ccproxy实现远程局域网本地访问
- Linux vi的剪切,复制和粘贴
热门文章
- 家电售后php网站源码,php家电维修源码-第一次接触php语言的最经典,最简单的源代码!!!!!!!!!!-电气资讯 - 电工屋...
- 数据库 主键 外键 唯一键区别
- fiddler4亲测有效,解决fiddler代理后手机的浏览器无法上网
- AndroidDevTools
- delphi7 TRichView 安装
- 我眼中的光明·第二周
- rtx 加密机制_[原创]RTX(腾讯通)本地保存密码TEA变形算法及还原器
- MAPGIS格式转为shp格式
- 使用御剑工具,扫描网站http://43.138.211.45的后台地址
- 英伟达 gsync demo NVIDIA 钟摆测试