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

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

break妖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值