项目添加音乐播放模块,找了几个别人写的,来学习总结一下,最后发现真的挺简单的
利用
ServiceConnection来把service绑定到当前activity,简单快捷,易于操作,但是限制是只能在本页面进行操作
在service中
如果是继续播放发送广播
Intent intent = new Intent(ACTION_START_PLAY);
intent.putExtra(Constant.Extra.AUDIO_POSITION, mPosition);
sendBroadcast(intent);
定时把数据传入
mAudioPlayerProxy中,
public class AudioPlayerProxy extends Binder {...}
private AudioPlayerProxy mAudioPlayerProxy;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mAudioPlayerProxy;
}
@Override
public void onCreate() {
super.onCreate();
mAudioPlayerProxy = new AudioPlayerProxy();
}
在activity中 有意思的是,如下图
private void startService() {
Intent intent = new Intent(getIntent());
intent.setClass(this, MusicPlayerService.class);
startService(intent);
}
private void registerBroadcast() {
IntentFilter intentFilter = new IntentFilter();
//监听开始播放的ACTION
intentFilter.addAction(MusicPlayerService.ACTION_START_PLAY);
registerReceiver(mUpdateReceiver, intentFilter);
}
private BroadcastReceiver mUpdateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(MusicPlayerService.ACTION_START_PLAY)) {
int pos = intent.getIntExtra(Constant.Extra.AUDIO_POSITION, -1);
updateStartPlay(pos);
}
}
};
更新进度和歌词是把handle放在activity中,不停地访问service中
mAudioPlayerProxy
得数据来设定自己或者使用其中的方法来设置
mMediaPlayer.
private void startUpdateLyric() {
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
if (mAudioPlayerProxy != null) {
mLyricView.roll(mAudioPlayerProxy.getProgress(), mAudioPlayerProxy.getDuration());
startUpdateLyric();
}
}
}, UPDATE_LYRIC_INTERVAL);
}
private void startUpdateProgress() {
if (mAudioPlayerProxy != null) {
int progress = mAudioPlayerProxy.getProgress();
int duration = mAudioPlayerProxy.getDuration();
if (progress > duration) {
progress = duration;
}
String time = StringUtils.formatDuration(progress) + "/" + StringUtils.formatDuration(duration);
mTime.setText(time);
mSeekBar.setProgress(mAudioPlayerProxy.getProgress());
}
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
startUpdateProgress();
}
}, DEFAULT_DELAY);
}
private ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mAudioPlayerProxy = (MusicPlayerService.AudioPlayerProxy) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
mAudioPlayerProxy = null;
}
};
@Override
protected void onResume() {
super.onResume();
Intent intent = new Intent(this, MusicPlayerService.class);
bindService(intent, mServiceConnection, BIND_AUTO_CREATE);
}
@Override
protected void onPause() {
super.onPause();
unbindService(mServiceConnection);
stopUpdateProgress();
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mUpdateReceiver);
}