zoukankan      html  css  js  c++  java
  • 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();
        }
      }

    }

  • 相关阅读:
    sql删除重复数据,保留一条
    sql列转行
    异步线程:一次性发送大量邮件
    限制接口的访问次数
    Kibana(安装及其简单crud)
    Elasticsearch(简介及其单节点搭建)
    大数据(日志分析)项目
    大数据(sqoop)
    大数据(Hive数据库、表的详解及其Hive数据导入导出)
    大数据(Hive的MetaStore切换及其Hive的语法细节)
  • 原文地址:https://www.cnblogs.com/jiww/p/5615009.html
Copyright © 2011-2022 走看看