android 音乐播放 启动方式 (1)利用内部类绑定service传送数据,只适用于单activity

来源:互联网 发布:asp.net mvc5 web编程 编辑:程序博客网 时间:2024/06/03 18:39
项目添加音乐播放模块,找了几个别人写的,来学习总结一下,最后发现真的挺简单的
https://github.com/DoYouLove/MVPlayer 项目地址
利用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@Overridepublic IBinder onBind(Intent intent) {    return mAudioPlayerProxy;}@Overridepublic 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;    }};@Overrideprotected void onResume() {    super.onResume();    Intent intent = new Intent(this, MusicPlayerService.class);    bindService(intent, mServiceConnection, BIND_AUTO_CREATE);}@Overrideprotected void onPause() {    super.onPause();    unbindService(mServiceConnection);    stopUpdateProgress();}@Overrideprotected void onDestroy() {    super.onDestroy();    unregisterReceiver(mUpdateReceiver);}





阅读全文
0 0
原创粉丝点击