最近在学习service相关的内容,在该部分的学习过程中,根据学习视频中的内容进行了总结归纳,以下是音乐播放器demo的开发思路,具体步骤及源码:
有关MVP框架的内容可看: link.
实现效果:
实现思路:
- 新建布局,初始化控件,设置点击事件
- 新建两个接口,一个用来定义相关操作(控制逻辑层),一个用来控制UI
- 创建service,注册service,(此处采用混合开启service的方式)(混合开启service: link.)开启service,绑定service
- 利用service绑定返回的binder对象来实现逻辑层的接口,UI接口
- 利用presenter实现逻辑操作,将该实例化对象给service
- 播放音频时的逻辑处理
- 将音频设置到模拟机上,manifest中设置读取权限
- 编写音频播放时、停止时的内部逻辑,修改button的显示内容
- 编写播放、暂停、停止时进度条的内部逻辑
- 实现进度条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