该程序的后台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. KaliLinux装好系统后安装常用软件

    1.配置软件源 leafpad /etc/apt/source.list or(recommand):#官方源deb kali main non-free contribdeb-src kali ma ...

  2. ZOJ-2365 Strong Defence 无公共边割边集

    题意:该题的题意晦涩,勉勉强强听别人说了一遍后再读了一遍题才算懂了题意,题图说的是A国因为B国药进攻自己的国家,于是想办法在联通A-B之间的路径上进行阻击.阻击的舰船停留在一个路径上,舰船上都要放置水 ...

  3. iOS - OC NSUserDefaults 数据存储

    前言 @interface NSUserDefaults : NSObject 用来保存应用程序设置和属性.用户保存的数据.用户再次打开程序或开机后这些数据仍然存在.如果往 userDefaults ...

  4. mysql 2003 10038 连接不上的解决

    网上写的很复杂,其实解决办法是 你在右键管理员权限下运行 mysqld. 忘记这个了,害的又找了近1个小时的时间找问题.

  5. 一切都是对象 Thinking in Java 第二章

    2.1 用引用操作对象 1.对象和引用联系起来,就可以通过引用来操作对象: 2.引用亦可单独存在,即没有和任何对象联系起来:对没有和对象联系起来的引用操作,会报错: 2.2 必须由你创建所有对象 1. ...

  6. [转载] 根据多年经验整理的《互联网MySQL开发规范》

    原文: http://weibo.com/p/2304181380b3f180102vsg5 根据多年经验整理的<互联网MySQL开发规范> 写在前面:无规矩不成方圆.对于刚加入互联网的朋 ...

  7. bootstrap 手风琴效果

    <!DOCTYPE HTML> <html><head><meta charset="utf-8"><title>按钮插 ...

  8. poj1375Intervals(点到圆的切线)

    链接 貌似这样的叫解析几何 重点如何求得过光源到圆的切线与地板的交点x坐标,可以通过角度及距离来算,如图, 根据距离和半径可以求得角度a.b.r,自然也可以求得d1,d2. 至于方向问题,在求r得时候 ...

  9. mysql 特殊字符

    1.倒引号,比如表中有一个字段为desc,在mysql中desc是关键字,如何表明desc是字段呢? 有两种办法:desc使用倒引号引起来,或者在desc前面加上表名,如下:mysql> sel ...

  10. 1503 - A PRIMARY KEY must include all columns in the table's partitioning function

    1503 - A PRIMARY KEY must include all columns in the table's partitioning function 错误的原因:表的主键字段必须包含分 ...