状态图及生命周期:
1:Idle(就绪)状态及End(结束)状态
Idle:创建MP实例或者调用reset函数,处于Idle状态;
此外,使用new操作符创建的MediaPlayer对象处于Idle状态,而那些通过重载的create()便利方法创建的MediaPlayer对象却不是处于Idle状态。事实上,如果成功调用了重载的create()方法,那么这些对象已经是Prepare状态了。
End:调用release函数,就会变成End状态。当处于End状态时,它将不能再被使用,不能再回到其他状态。
2.Error(错误)状态
在构造一个新的MP实例或者调用reset函数,即在处于Idle状态时,调用getCurrentPosition(), getDuration(), getVideoHeight(), getVideoWidth(), setAudioStreamType(int), setLooping(boolean),setVolume(float, float), pause(), start(), stop(), seekTo(int), prepare() 或者 prepareAsync() 方法都是编程错误。
当一个MediaPlayer对象刚被构建的时候,内部的播放引擎和对象的状态都没有改变,在这个时候调用以上的那些方法,框架将无法回调客户端程序注册的OnErrorListener.onError()方法;
但若这个MediaPlayer对象调用了reset()方法之后,再调用以上的那些方法,内部的播放引擎就会回调客户端程序注册的OnErrorListener.onError()方法了,将会触发MP到Error状态,并将错误的状态传入。
所以一旦不再使用MediaPlayer,就需要调用release函数释放资源。
3.Initialized(初始化)状态
当调用setDataSourse()函数时,MP将会从Idle状态变为Initialized状态;
如果在非Idle状态调用setDataSourse,会抛出IllegalStateExecption异常。
当重载setDataSourse时需要抛出IllegalArgumentException(非法参数异常)和IOException两个异常。
4.Prepared(准备)状态
有两种途径到达Prepared状态
(1)同步方式(使用本地音视频文件):
调用parpare(同步函数)将从Initialized状态变为Prepared状态。
(2)异步方式(使用网络数据,需要缓冲数据):
调用prepareAsync(异步函数)将从Initialized状态变为Preparing状态,最后到Prepared。
5.Started(开始)状态
进入Prepared状态后,上层应用可以设置一些属性(音量等),必须调用start函数并成功返回,MP的状态由Prepared变为Started。
如果MediaPlayer已处于Started状态,再调用start函数无效。
6.Pause(暂停)状态
MP在播放控制时可以是Pause状态和Stop状态,且当前播放进度可以被调整。
调用MediaPlayer.pause函数,有Started变为Pause,这个过程是瞬时的。
7.Stopped(停止)状态
调用stop函数时,无论处于Started、Paused、Prepared或PlaybackCompleted哪种状态,都会进入Stopped状态。
一旦处于Stopped状态,playback将不能开始,直到MP重新处于Prepared状态。
8.PlaybackCompleted(播放完成)状态
当前播放位置可通过getCurrentPosition函数获取。
MP播放到数据流末尾,一次播放过程完成,如果事先调用setLooping(true),表示循环播放,MP依然处于Started状态。
如果不循环播放,一次播放完成后MP进入PlaybackCompleted,此时调用start函数,将重启播放器从头开始播放数据。