BroadcastReceiver的实例----基于Service的音乐播放器之二
该程序的后台Service会在播放状态发生改变时对外发送广播(广播将会激发前台Activity的BroadcastReceiver);它也会采用BroadcastReceiver监听来自前台Activity所发出的广播。后台Service的代码如下:
import java.io.IOException;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.IBinder;
public class MusicService extends Service{
MyReceiver serviceReceiver;
AssetManager am;
String[] musics = new String[]{
"wish.mp3","promise.mp3","beautiful.mp3"
};
MediaPlayer mPlayer;
//当前的状态,0x11代表没有播放,0x12代表正在播放,0x13代表暂停
int status = 0x11;
//记录当前正在播放的音乐
int current = 0;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
am = getAssets();
//创建BroadcastReceiver
serviceReceiver = new MyReceiver();
//创建IntentFilter
IntentFilter filter = new IntentFilter();
filter.addAction(MusicBox.CTL_ACTION);
registerReceiver(serviceReceiver, filter);
//创建MediaPlayer
mPlayer = new MediaPlayer();
//为MediaPlayer播放完成事件绑定监听器
mPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
current++;
if(current >= 3){
current = 0;
}
//发送广播通知Activity更改文本框
Intent sendIntent = new Intent(MusicBox.UPDATE_ACTION);
sendIntent.putExtra("current", current);
//发送广播,将被Activity组件中的BroadcastReceiver接收到
sendBroadcast(sendIntent);
//准备并播放音乐
prepareAndPlay(musics[current]);
}
});
super.onCreate();
}
public class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
int control = intent.getIntExtra("control", -1);
switch(control){
//播放或暂停
case 1:
//原来处于没有播放状态
if(status == 0x11){
//准备并播放音乐
prepareAndPlay(musics[current]);
status = 0x12;
}
//原来处于播放状态
else if(status == 0x12){
//暂停
mPlayer.pause();
//改变为暂停状态
status = 0x13;
}
//原来处于暂停状态
else if(status == 0x13){
//播放
mPlayer.start();
//改变状态
status = 0x12;
}
break;
//停止声音
case 2:
//如果原来正在播放或暂停
if(status == 0x12 || status == 0x13){
//停止播放
mPlayer.stop();
status = 0x11;
}
}
//发送广播通知Activity更改图标、文本框
Intent sendIntent = new Intent(MusicBox.UPDATE_ACTION);
sendIntent.putExtra("update", status);
sendIntent.putExtra("current", current);
//发送广播,将被Activity组件中的BroadcastReceiver接收到
sendBroadcast(sendIntent);
}
}
private void prepareAndPlay(String music){
try {
//打开指定音乐文件
AssetFileDescriptor afd = am.openFd(music);
mPlayer.reset();
//使用MediaPlayer加载指定的声音文件
mPlayer.setDataSource(afd.getFileDescriptor(),
afd.getStartOffset(),afd.getLength());
//准备声音
mPlayer.prepare();
//播放
mPlayer.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
BroadcastReceiver的实例----基于Service的音乐播放器之二的更多相关文章
- BroadcastReceiver的实例----基于Service的音乐播放器之一
下面的程序开发了一个基于Service的音乐盒,程序的音乐将会由后台运行的Service组件负责播放,当后台的播放状态发生改变时,程序将会通过发送广播通知前台Activity更新界面:当用户单击前台A ...
- 基于jQuery虾米音乐播放器样式代码
分享一款基于jQuery虾米音乐播放器样式代码.这是一款基于jquery+html5实现的虾米音乐播放器源码下载.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div c ...
- QT5:C++实现基于multimedia的音乐播放器(二)
今天接着上一篇来实现播放器的槽函数. 先来实现播放模式,槽函数如下: //播放模式 void Music::musicPlayPattern() { //z=++z%3; ) { //顺序播放 pla ...
- QT5:C++实现基于Multimedia的音乐播放器(序)
前段时间C++课设,决定做个播放器,于是参考了网上的代码后,做了个很简陋的音乐播放器(只写了MP3格式)出来,虽然功能甚少,但还是决定把过程记录一下. 成品如下图: 播放器功能: 上.下一首,音量控制 ...
- 兼容IE7音乐播放器之jplayer的使用
首先列出为何要写这篇随笔的原因: 1:兼容IE7 2:音乐播放器 3:任意控制播放器 1: 最近做的网站需要兼容IE7,在此之前已经写好了关于音乐播放的插件,火狐,IE8以上,以及谷歌浏览器等都可以随 ...
- iOS 音乐播放器之锁屏效果+歌词解析
概述 功能描述:锁屏歌曲信息.控制台远程控制音乐播放:暂停/播放.上一首/下一首.快进/快退.列表菜单弹框和拖拽控制台的进度条调节进度(结合了QQ音乐和网易云音乐在锁屏状态下的效果).歌词解析并随音乐 ...
- 音乐播放器之myeclipse项目
音乐播放器: 这个音乐播放器是用myeclipse打开的项目.假设有问题记得改掉文件的路径名.还有假设图片不显示也可能是图片的路径名不正确,如音乐无法播放也可能是路径名不正确.总之这个游戏有文件的引用 ...
- QT5:C++实现基于multimedia的音乐播放器(一)
上一篇里简略的描述了一下播放器的实现,这一篇开始具体描述一下过程. 环境配置:Qt Creator 打开Qt Creator,创建一个new project,项目名称随你喜欢(我的是MusicPlay ...
- iOS - 音乐播放器之怎么获取音乐列表
方法一: 这个方法是通过获取到沙盒路径,来得到音乐的路径(使用这个方法需要把音乐放进沙盒) NSFileManager *manager = [NSFileManager defaultManager ...
随机推荐
- Java中ArrayList相关的5道面试题
本文参考了 <关于ArrayList的5道面试题 > 1.ArrayList的大小是如何自动增加的? 这个问题我想曾经debug过并且查看过arraylist源码的人都有印象,它的过程是: ...
- JS实现复选框全选全不选以及子复选框带动全选框的选中
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- JavaWeb学习总结(一)—JavaWeb开发入门及环境搭建
一.基本概念 1.1.软件体系结构 1.C/S:Client/Servlet,例如QQ就是CS结构需要编写服务器端程序和客户端程序.缺点:更新需要两端,总要求客户下载新的客户端程序优点:安全性比较好2 ...
- 2 CSS
2 CSS CSS基础 html 在一个网页中负责的事情是一个页面的结构css(层叠样式表) 在一个网页中主要负责了页面的数据样式. 编写css代码的方式: 第一种: 在style标签中编写c ...
- Linux mysql常用操作命令
原文:http://blog.csdn.net/lifuxiangcaohui/article/details/46375931 1.linux下启动MySQL的命令:mysqladmin start ...
- OpenGL的几何变换2之内观察立方体
我想实现的一个场景是:一个立方体,相机的坐标在立方体的中心点,相机不变,立方体旋转,可以站在立方体中心点查看立方体内部. 实际上就是立方体图像,这是在全景图片当作比较简单的方式,画面不会变形和扭曲,但 ...
- HM中字典编码分析
LZ77算法基本过程 http://jpkc.zust.edu.cn/2007/dmt/course/MMT03_05_2.htm LZ77压缩算法详解 http://wenku.baidu.com/ ...
- Django中如何配置Database缓存?
BACKEND: django.core.cache.backends.db.DatabaseCache LOCATION: 数据库表名 示例: CACHES = { 'default': { 'BA ...
- phalcon几种分页方法
phalcon几种分页方法 一: use Phalcon\Paginator\Adapter\Model as PaginatorModel; // Current page to show // I ...
- 【转】 Linux chmod命令
在Unix和Linux的各种操作系统下,每个文件(文件夹也被看作是文件)都按读.写.运行设定权限.例如我用ls -l命令列文件表时,得到如下输出:-rw-r--r-- 1 apple users 22 ...