当前位置:操作系统 > 安卓/Android >>

Android歌词秀设计思路(5)歌词播放服务

接下来说明一下,提供歌词播放器服务的LyricPlayerService。这个类在整个播放过程中的作用是
1.负责管理LyricAdapter的生命周期。
2.控制音乐播放,歌词解析,并且协调音乐与歌词同步。
3.收集超类,LyricAdapter发来的通知并传递给登录的LyricAdapterListener
首先是看一下这个类在全体图中的位置。

 
从图中我们可以明显的看出这个类处于整个图中的节点位置,光从这一点就可以理解这个类的重要性。
代码不多,简单说明一下。
首先是定义用于从LyricPlayerService接收状态变化通知的接口并提供了指定具象接口的方法。
在歌曲播放过程中,继续应用退出LyricPlayerService还会继续执行。这时如果重新启动播放器应用程序,就有一个重新建立联系,也就是播放中的LyricPlayerService指定接口的场景。在LyricPlayerService的设计中,会重新调用LyricPlayerListener的onLyricLoad和onLyricChanged方法。这样应该可以简化应用侧的实现。
    //定义接受播放器状态变化的接口 
    public interface LyricPlayerListener{ 
        //播放位置发生变化 
        public void onPositionChanged(long position); 
        //播放器状态发生变化 
        public void onStateChanged(); 
        //当前歌词变化 
        public void onLyricChanged(int lyric_index); 
        //歌词文件解析完了 
        public void onLyricLoaded(); 
    } 
     
    private LyricPlayerListener mLyricPlayerListener = null; 
     
    void setLyricPlayerListener(LyricPlayerListener listener){ 
        mLyricPlayerListener = listener; 
        if(mLyricPlayerListener != null) 
        { 
            //新设定Listener直接调用onLyricLoad方法,给以个准备表是内容的机会。 
            mLyricPlayerListener.onLyricLoaded(); 
            int curLyric = mLyricAdapter.getCurrentLyric(); 
            if(curLyric >= 0 && curLyric < mLyricAdapter.getLyricCount()){ 
                //如果已经处于播放中状态,将现在歌词通知给Listener 
                mLyricPlayerListener.onLyricChanged(curLyric); 
            } 
        } 
    }
创建LyricAdapter的实例
private LyricAdapter mLyricAdapter = new LyricAdapter();
创建SafetyTimer的实例并制定动作。在OnTimer事件中,首先取得MediaPlayer的现在播放位置并将这个信息通知给LyricAdapter和登录的mLyricPlayerListener。内容很简单,但是这里是LyricPlayerService能够正常动作的最主要的部分。除了我们看不到的歌曲播放部分,这里差不多算是半个主程序了。
private SafetyTimer mLyricTimer = new SafetyTimer(500, new SafetyTimer.OnTimeListener(){ 
        public void OnTimer(){ 
            if(mMediaPlayer != null){ 
                int position = mMediaPlayer.getCurrentPosition(); 
                if(mLyricPlayerListener != null){ 
                    mLyricPlayerListener.onPositionChanged(position); 
                } 
                mLyricAdapter.notifyTime(position); 
            } 
        }    
    });
onCreate和onDestroy没有什么特别的。当然在onDestroy里面也可以调用mLyricAdapter.setListener(null); 没有什么区别。
@Override
    public void onCreate() { 
        super.onCreate(); 
        mLyricAdapter.setListener(this); 
    } 
 
    @Override
    public void onDestroy() { 
        super.onDestroy(); 
        mLyricAdapter = null; 
    }
接下来是播放控制关联方法。主要做以下几件事
1.调用超类的功能。
2.控制SafetyTimer的动作。
3.条用Listener的对应功能。
 
@Override
    public void start() { 
        if(isStop()){ 
            //停止状态开始,需要重新启动Timer 
            super.start(); 
            mLyricTimer.startTimer(); 
        }else{ 
            //暂停状态开始,不需要重启Timer 
            super.start(); 
        } 
        if(mLyricPlayerListener != null){ 
            mLyricPlayerListener.onStateChanged(); 
        } 
    }    
     
    @Override
    public void stop() { 
        mLyricTimer.stopTimer(); 
        super.stop(); 
        if(mLyricPlayerListener != null){ 
            mLyricPlayerListener.onStateChanged(); 
        } 
    }    
     
    @Override
    public void pause() { 
        super.pause(); 
        if(mLyricPlayerListener != null){ 
            mLyricPlayerListener.onStateChanged(); 
        } 
    }    
 
下面的两个方法覆盖了,超类的对应方法,把本

补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,