Android MediaPlayer状态及生命周期

状态图及生命周期:

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函数,将重启播放器从头开始播放数据。

猜你喜欢

转载自blog.csdn.net/qq_37980878/article/details/106693967