该程序的后台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的音乐播放器之二的更多相关文章

  1. BroadcastReceiver的实例----基于Service的音乐播放器之一

    下面的程序开发了一个基于Service的音乐盒,程序的音乐将会由后台运行的Service组件负责播放,当后台的播放状态发生改变时,程序将会通过发送广播通知前台Activity更新界面:当用户单击前台A ...

  2. 基于jQuery虾米音乐播放器样式代码

    分享一款基于jQuery虾米音乐播放器样式代码.这是一款基于jquery+html5实现的虾米音乐播放器源码下载.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div c ...

  3. QT5:C++实现基于multimedia的音乐播放器(二)

    今天接着上一篇来实现播放器的槽函数. 先来实现播放模式,槽函数如下: //播放模式 void Music::musicPlayPattern() { //z=++z%3; ) { //顺序播放 pla ...

  4. QT5:C++实现基于Multimedia的音乐播放器(序)

    前段时间C++课设,决定做个播放器,于是参考了网上的代码后,做了个很简陋的音乐播放器(只写了MP3格式)出来,虽然功能甚少,但还是决定把过程记录一下. 成品如下图: 播放器功能: 上.下一首,音量控制 ...

  5. 兼容IE7音乐播放器之jplayer的使用

    首先列出为何要写这篇随笔的原因: 1:兼容IE7 2:音乐播放器 3:任意控制播放器 1: 最近做的网站需要兼容IE7,在此之前已经写好了关于音乐播放的插件,火狐,IE8以上,以及谷歌浏览器等都可以随 ...

  6. iOS 音乐播放器之锁屏效果+歌词解析

    概述 功能描述:锁屏歌曲信息.控制台远程控制音乐播放:暂停/播放.上一首/下一首.快进/快退.列表菜单弹框和拖拽控制台的进度条调节进度(结合了QQ音乐和网易云音乐在锁屏状态下的效果).歌词解析并随音乐 ...

  7. 音乐播放器之myeclipse项目

    音乐播放器: 这个音乐播放器是用myeclipse打开的项目.假设有问题记得改掉文件的路径名.还有假设图片不显示也可能是图片的路径名不正确,如音乐无法播放也可能是路径名不正确.总之这个游戏有文件的引用 ...

  8. QT5:C++实现基于multimedia的音乐播放器(一)

    上一篇里简略的描述了一下播放器的实现,这一篇开始具体描述一下过程. 环境配置:Qt Creator 打开Qt Creator,创建一个new project,项目名称随你喜欢(我的是MusicPlay ...

  9. iOS - 音乐播放器之怎么获取音乐列表

    方法一: 这个方法是通过获取到沙盒路径,来得到音乐的路径(使用这个方法需要把音乐放进沙盒) NSFileManager *manager = [NSFileManager defaultManager ...

随机推荐

  1. 用Java集合中的Collections.sort方法对list排序的两种方法

    用Collections.sort方法对list排序有两种方法第一种是list中的对象实现Comparable接口,如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

  2. 查看package编译时的错误信息及重新编译

    开发时,一般都是使用PL/SQL工具进行开发,查看编译错误及重新编译都很简单,但是一般的生产环境是不允许连接外界工具的,只能在命令行中进行重新编译及查看,今天我就遇到了这个问题,现在总结如下: 1.获 ...

  3. JavaSE复习_2 对象与类

    △java中的制表符.'\t'制表符."\t"也可以. △方法内不能再定义一个方法,互相平级. △数组中boolean类型的变量默认为false;char默认为'\u0000'(\ ...

  4. (三)结构体指针、sizeof

    (一)结构体指针定义 今天上班写了一段测试代码,结果在linux下编译出现段错误,刚开始一直找不到原因,后来找了度娘才搞懂了.我先贴出来第一次写的代码以及gcc编译器下报的错误: #include&l ...

  5. C++——类继承

    类库:类库由类声明和实现构成.类组合了数据表示和类方法,因此提供了比函数库更加完整的程序包. 类继承:从已有的类派生出新的类,派生类继承了原有类(称为基类)的特征,包括方法. 通过类继承可以完成的工作 ...

  6. JavaScript设计模式-单例模式、模块模式(转载 学习中。。。。)

    (转载地址:http://technicolor.iteye.com/blog/1409656) 之前在<JavaScript小特性-面向对象>里面介绍过JavaScript面向对象的特性 ...

  7. HTML5地理位置概述和地理位置对象的详解

    一.地理位置 经度  :   南北极的连接线 纬度  :   东西连接的线   二.位置信息从何而来 IP地址 GPS全球定位系统 Wi-Fi无线网络 基站         三.地理位置对象(navi ...

  8. hiho_99_骑士问题

    题目大意 给定国际象棋8x8棋盘上三个起始点,三个骑士分别从三个起始点开始移动(骑士只能走日字,且骑士从任意一点出发可以走遍整个棋盘).现要求三个骑士汇聚到棋盘上某个点,且使得骑士到达该点所移动的次数 ...

  9. Mysql有两种存储引擎:InnoDB与Myisam

    http://www.cnblogs.com/kevingrace/p/5685355.html

  10. Python设计模式之单例模式

    1.由于语言的特性不同,设计模式的实现方式和实现难度也会不同 2.有的模式已经在语言内置了,比如迭代器模式. 3.单例模式可以直接用模块级变量来实现 4.普通工厂模式可以直接通过传入"类名& ...