【Android】MediaPlayer生命周期


不积跬步,无以至千里;不积小流,无以成江海。要沉下心来,诗和远方的路费真的很贵!

【Android】MediaPlayer生命周期

参考博客:MediaPlayer的状态图和生命周期

  • MediaPlayerAndroid中的多媒体播放类,其可以控制音视频、流文件或者本地音视频资源的播放过程。

  • 下图为MediaPlayer的整个生命周期的状态图。
    在这里插入图片描述

  • 上图中,蓝色椭圆形代表了MediaPlayer的各个状态,弧线代表了状态改变之间的方法。其中单箭头弧表示同步函数的调用,双箭头弧表示异步函数的调用。

  • MediaPlayerIdle状态到End状态的过程,就是其生命周期。

1. Idle状态(就绪状态)

  • 使用new方法,去创建MediaPlayer实例。
  • 使用MediaPlayerreset()方法。

2. End状态

  • 使用MediaPlayerrelease()方法。
  • MediaPlayer处于End状态时,它将不能再被使用,这个时候不能再回到MediaPlayer的其他状态,因为本次生命周期已经终止。

3. Error状态

  • MediaPlayer调用reset()函数之后 。上层应用调用getCurrentPosition()getDuration()getVideoHeight() getVideoWidth()setAudioAttributes(android.media.AudioAttributes)setLooping(boolean)setVolume(float, float)pause()start()stop()seekTo(long, int)prepare()或者prepareAsync()这些函数都会出错。

  • 出错后会回调到用户提供的回调方法OnErrorListener.onError(),这时候MediaPlayer就处于Error状态。所以一旦不再使用MediaPlayer,就需要调用release()函数,以便MediaPlayer资源得到合理的释放。

  • 在一般情况下,由于种种原因一些播放控制操作可能会失败。如不支持的音频/视频格式,缺少隔行扫描的音频/视频,分辨率太高,流超时等原因。

  • 一旦发生错误,MediaPlayer对象会进入到Error状态。为了重用一个处于Error状态的MediaPlayer对象,可以调用reset()方法来把这个对象恢复成Idle状态。

4. Initialized状态

  • 调用setDataSource()类型的方法,会使处于Idle状态的对象迁移到Initialized状态。
  • 若当此MediaPlayer处于其它的状态下,调用setDataSource()方法,会抛出IllegalStateException异常。

5. Prepared状态

  • 在开始播放之前,MediaPlayer对象必须要进入Prepared状态。
  • 进入Prepared状态,可以使用同步和异步两种方法。
  • 同步方法——prepare(),会在该对象进入Prepared状态后返回。
  • 异步方法——prepareAsync(),会在该对象在Preparing状态就返回,需要注册OnPreparedListener.onPrepared()监听方法,判断是否进入Prepared状态。
  • 只有MediaPlayer对象进入了Prepared状态,才可以对音视频的属性进行调整。

6. Preparing状态

  • 使用prepareAsync()方法进入。

7. Started状态

  • MediaPlayer对象位于Prepared状态后,使用start()方法进入Started状态。
  • 如果MediaPlayer已经处于Started状态,再调用start()函数是没有任何作用的。

8. Paused状态

  • MediaPlayer对象位于Started状态后,使用pause()方法进入Paused状态。

  • MediaPlayer对象位于Paused状态后,使用start()方法令其重新播放。

  • 如果MediaPlayer已经处于Paused状态,再调用pause()函数是没有任何作用的。

  • Started状态和Paused状态之间的转换是瞬间的,在播放器内部是一个异步过程。

9. Stopped状态

  • 当调用stop()函数时,MediaPlayer无论正处于StartedPausedPreparedPlaybackCompleted中的哪种状态,都将进入Stopped状态。

  • 一旦处于Stopped状态,start()方法将不能开始,直到重新调用prepare()prepareAsync()函数,且处于Prepared状态时才可以开始。

  • 如果MediaPlayer已经处于Stopped状态,再调用stop()函数是没有任何作用的。

  • seekTo函数可以在其他状态下被调用,如PreparedPausedPlaybackCompleted状态。

10. PlaybackCompleted状态

  • 当前播放的位置可以通过getCurrentPosition函数获取,可以跟踪播放器的播放进度。

  • MediaPlayer播放到数据流的末尾时,一次播放过程完成。

  • MediaPlayer中事先调用setLooping(boolean)并设置为true,表示循环播放,MediaPlayer依然处于Started状态。

  • 如果调用setLooping(boolean)并设置为false,并且事先在MediaPlayer上注册过 setOnCompletionListener监听,那么播放器内部将回调onCompletion函数。这就表明 MediaPlayer 开始进入PlaybackCompleted状态。

  • 当处于PlaybackCompleted 状态时,调用start()函数,将重启播放器从头开始播放数据。

总结

  • 上述从Idle状态到End状态的过程,就是MediaPlayer的生命周期。

  • 状态之间的改变,使用什么函数,有要求。必须位于哪个状态,才可以使用哪些函数去进行状态之间的改变。否则会抛出不合法异常——IllegalStateException

  • 使用函数时,需要注意其当前状态,所以了解其生命周期更有利于我们使用其进行音视频播放控制。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值