该程序的后台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. LVS--NAT模型配置

    环境准备 管理IP地址 角色 备注 192.168.11.131 调度器(Director) 对外提供VIP服务的地址为192.168.1.114 192.168.11.132 RS1  网关为192 ...

  2. js object(对象)

    http://www.cnblogs.com/pingchuanxin/p/5773326.html Object(对象)是在所有的编程语言中都十分重要的一个概念,对于事物我们可以把他们看作是一个对象 ...

  3. jpeg了解

    JPEG是一个压缩标准,又可分为标准 JPEG.渐进式JPEG及JPEG2000三种: ①标准JPEG:以24位颜色存储单个光栅图像,是与平台无关的格式,支持最高级 别的压缩,不过,这种压缩是有损耗的 ...

  4. LINUX多线程(一)(创建和退出)

    1. Linux多线程概述 1.1. 概述 进程是系统中程序执行和资源分配的基本单位.每个进程有自己的数据段.代码段和堆栈段.这就造成进程在进行切换等操作时都需要有比较负责的上下文切换等动作.为了进一 ...

  5. word2010表格中的内容怎么设置行距

    选中表格,然后根据箭头指示点击 弹出如下对话框,选择行距

  6. ResponseUtil反射制造唯一结果

    调用:通过反射调用同一个类型的返回值 return fillResponse(response,Constants.SUCCESS,"获取数据成功","taskList& ...

  7. Python装饰模式实现源码分享

    1.一般来说,通过继承可以获得父类的属性,还可以通过重载修改其方法. 2.装饰模式可以不以继承的方式而动态地修改类的方法. 3.装饰模式可以不以继承的方式而返回一个被修改的类. 4.基本实现 程序演示 ...

  8. mysql:恢复mysql表结构

    mysql,frm格式恢复mysql表结构,以tuser.frm格式为例   新增数据库,如下,创建数据库名为ab   打开数据库,双击打开数据库   点右键新建表结构   新增表,里面只添加一个字段 ...

  9. [转]Android 5.0——Material Design详解(动画篇)

    Material Design:Google推出的一个全新的设计语言,它的特点就是拟物扁平化. Material Design包含了很多内容,今天跟大家分享一下Material新增的动画: 在Andr ...

  10. Dorado7 4版本升级5版本问题汇总

    1.4版本中使用@Bind #dataType1.onInsert没问题,使用@Bind @dataType1.onInsert也没问题,5版本中前者不会触发