【Android-Service】基于MVP的音乐播放器demo实现思路(附源码)

最近在学习service相关的内容,在该部分的学习过程中,根据学习视频中的内容进行了总结归纳,以下是音乐播放器demo的开发思路,具体步骤及源码:

有关MVP框架的内容可看: link.

实现效果:
在这里插入图片描述
实现思路:

  1. 新建布局,初始化控件,设置点击事件
  2. 新建两个接口,一个用来定义相关操作(控制逻辑层),一个用来控制UI
  3. 创建service,注册service,(此处采用混合开启service的方式)(混合开启service: link.)开启service,绑定service
  4. 利用service绑定返回的binder对象来实现逻辑层的接口,UI接口
  5. 利用presenter实现逻辑操作,将该实例化对象给service
  6. 播放音频时的逻辑处理
  7. 将音频设置到模拟机上,manifest中设置读取权限
  8. 编写音频播放时、停止时的内部逻辑,修改button的显示内容
  9. 编写播放、暂停、停止时进度条的内部逻辑
  10. 实现进度条UI更新

——————————————————————————————
实现源码:
manifest中设置读写权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

音频文件存放路径:
在这里插入图片描述

IPlayerViewControl.java

public interface IPlayerViewControl {
   
    void onPlayStateChange(int state);  //播放状态改变的通知,state为当前状态
    void onSeekChange(int seek);        //播放进度改变
}

IPlayerControl.java

public interface IPlayControl {
   

    //播放状态
    public static final int PLAY_STATE_PLAY=1;    //播放
    public static final int PLAY_STATE_PAUSE=2;     //暂停
    public static final int PLAY_STATE_STOP=3;      //停止


    void regiestViewController(IPlayerViewControl viewController);  //把UI的控制接口设置给逻辑层
    void unRegiestViewController(); //取消接口通知的注册
    void playOrPause();    //播放或暂停音乐
    void stop();    //停止播放
    void seekTo(int seek);  //设置播放进度,seek表示播放进度
}

PlayerPresenter


import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Binder;
import android.util.Log;

import com.example.serviceddemo.interfaces.IPlayControl;
import com.example.serviceddemo.interfaces.IPlayerViewControl;

import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;

public class PlayerPresenter extends Binder implements IPlayControl {
   

    private static final String TAG ="PlayerPresenter" ;
    private IPlayerViewControl mViewController;  //这个变量用来控制UI
    private int currentState=PLAY_STATE_STOP;   //默认状态为暂停
    private MediaPlayer mediaPlayer;
    private Timer timer;
    private SeekTimeTask seekTimeTask;

    @Override
    public void regiestViewController(IPlayerViewControl viewController) {
   
        this.mViewController=viewController;
    }

    @Override
    public void unRegiestViewController() {
   
        mViewController=null;
    }

    @Override
    public void playOrPause() {
   
        Log.d(TAG,"playOrPause......");
        if(currentState == PLAY_STATE_STOP){
   
            //暂停状态,此时是没有播放器的,创建播放器
            initPlayer();
            //如果不为空的话就设置数据源
            if(mediaPlayer != null){
   
                try {
   
                    mediaPlayer.setDataSource("/mnt/sdcard/song.mp3");
                    mediaPlayer.prepare();
                    mediaPlayer.start();
                    currentState=PLAY_STATE_PLAY;
                    startTimer();
                } catch (IOException e) {
   
                    e.printStackTrace();
                }
            }
        }else if(currentState == PLAY_STATE_PLAY){
         //如果当前的状态是播放的,那就去暂停
            if (mediaPlayer != null
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值