音乐播放 启动方式 (2) service发送msg给activity

不推荐使用,可以加深知识理解

activity中 根据 Handler 接收结果 , 刷新 ui
private Handler handler = new Handler() {//接收结果,刷新ui

   public void handleMessage(android.os.Message msg) {
      switch (msg.what) {
      case Constants.MSG_ONPREPARED:
         int currentPosition = msg.arg1;
         int totalDuration = msg.arg2;
         mTv_curduration.setText(MediaUtils.duration2Str(currentPosition));
         mTv_totalduration.setText(MediaUtils.duration2Str(totalDuration));
         mSk_duration.setMax(totalDuration);
         mSk_duration.setProgress(currentPosition);
         // 歌词 .....
         break;
      case Constants.MSG_ONCOMPLETION:
         //更加当前的播放model做对应的处理
         if (MediaUtils.CURMODEL == Constants.MODEL_NORMAL) {//当前是顺序播放
            if (MediaUtils.CURPOSITION < MediaUtils.songList.size() - 1) {
               changeColorWhite();
               MediaUtils.CURPOSITION++;//MediaUtils.CURPOSITION最大值就是MediaUtils.songList.size() - 1
               changeColorGreen();
               startMediaService("播放", MediaUtils.songList.get(MediaUtils.CURPOSITION).path);
            } else {
               startMediaService("停止");
            }
         } else if (MediaUtils.CURMODEL == Constants.MODEL_RANDOM) {//当前是随机播放
            Random random = new Random();
            int position = random.nextInt(MediaUtils.songList.size());
            changeColorWhite();
            MediaUtils.CURPOSITION = position;
            changeColorGreen();
            startMediaService("播放", MediaUtils.songList.get(MediaUtils.CURPOSITION).path);
         } else if (MediaUtils.CURMODEL == Constants.MODEL_REPEAT) {//当前是重复播放
            if (MediaUtils.CURPOSITION < MediaUtils.songList.size() - 1) {
               changeColorWhite();
               MediaUtils.CURPOSITION++;//MediaUtils.CURPOSITION最大值就是MediaUtils.songList.size() - 1
               changeColorGreen();
            } else {
               changeColorWhite();
               MediaUtils.CURPOSITION = 0;
               changeColorGreen();
               startMediaService("播放", MediaUtils.songList.get(MediaUtils.CURPOSITION).path);
            }
         } else if (MediaUtils.CURMODEL == Constants.MODEL_SINGLE) {//当前是单曲循环
            startMediaService("播放", MediaUtils.songList.get(MediaUtils.CURPOSITION).path);
         }
         break;
      default:
         break; } };};


seekbar的拖拽中直接:  startMediaService("进度", seekBar.getProgress());
点击事件中
//播放按钮,点击同一个按钮.有两个操作.需要定义一个变量进行控制
   //启动服务.而且让服务播放音乐
   if (MediaUtils.CURSTATE == Constants.STATE_STOP) {//默认是停止,点击就变播放
      startMediaService("播放", MediaUtils.songList.get(MediaUtils.CURPOSITION).path);
   } 

 
startMediaService方法如下: 发送Messenger给service
public void startMediaService(String option, int progress) {
   Intent service = new Intent(MainActivity.this, MusicService.class);
   service.putExtra("messenger", new Messenger(handler));
   service.putExtra("option", option);
// service.putExtra("path", path);
   service.putExtra("progress", progress);
   startService(service);
}

在service中发送message给activity的handle
@Override
public IBinder onBind(Intent intent) {
   // TODO
   return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {//每次启动都会来到此方法
   String option = intent.getStringExtra("option");
   if (mMessenger == null) {
      mMessenger = (Messenger) intent.getExtras().get("messenger");
   }
   if ("播放".equals(option)) {
      String path = intent.getStringExtra("path");
      play(path);
   } else if ("进度".equals(option)) {
      int progress = intent.getIntExtra("progress", -1);
      seekPlay(progress);
   }
   return super.onStartCommand(intent, flags, startId);
}


/**---------------封装音乐播放常见的方法 end---------------**/

/**---------------相关的回调方法---------------**/
@Override
public void onCompletion(MediaPlayer mp) {
   try {
      //service发送消息.告诉activity,当前的歌曲播放完了
      Message msg = Message.obtain();
      msg.what = Constants.MSG_ONCOMPLETION;
      //发送消息
      mMessenger.send(msg);
   } catch (RemoteException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
   }
}

@Override
public void onPrepared(MediaPlayer mp) {
   if (mTimer == null) {
      mTimer = new Timer();
   }
   mTimer.schedule(new TimerTask() {
      @Override
      public void run() {
         try {
            //1.准备好的时候.告诉activity,当前歌曲的总时长
            int currentPosition = mPlayer.getCurrentPosition();
            int totalDuration = mPlayer.getDuration();
            Message msg = Message.obtain();
            msg.what = Constants.MSG_ONPREPARED;
            msg.arg1 = currentPosition;
            msg.arg2 = totalDuration;

            //发送消息
            mMessenger.send(msg);
         } catch (RemoteException e) {
            e.printStackTrace();
         }
      }
   }, 0, 1000);

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值