android Mediaplayer生命周期

1、状态图

        音频/视频文件或流媒体的回放控制是以状态机的形式管理的。下面的状态图显示了被回放控制操作支持的MediaPlayer 的生命周期和状态。椭圆形代表MediaPlayer 可以存在的状态,弧线代表推动状态转换的回放控制操作。有两种弧线类型,有单箭头的弧线代表同步的调用方法,双箭头的则代表异步方式。

       
MediaPlayer State diagram


从这个状态图中, 可以看出一个MedioPlayer有以下几个状态:

1、Idle(空闲)状态当使用new()方法创建一个MediaPlayer对象或者调用了其reset()方法时,该MediaPlayer对象处于idle状态。
注意:1)一个使用new()方法新建的MediaPlayer对象在Idle状态调用诸如 getCurrentPosition(), getDuration(), getVideoHeight(), getVideoWidth(), setAudioStreamType(int), setLooping(boolean), setVolume(float, float), pause(), start(), stop(), seekTo(int), prepare() 或prepareAsync()的时候不会触发onErrorListener.onError()事件,但是MediaPlayer对象如果在调用reset()方法进入Idle状态后,调用上述方法会触发onErrorListener.onError()事件,并且这个对象将转换为Error状态

        2)当一个MediaPlayer对象不再使用时,最好通过release() 方法释放资源,使其处于End状态。一旦MediaPlayer对象处于End状态,就不能再被使用,且不能通过其他方法使其回到其他状态。

        3)调用create方法成功创建的MediaPlayer对象是处于Prepared状态的。

        4)在无效状态时调用prepare(),prepareAsync(),或重载setDataSource方法时会抛出IllegalStateException异常

2、Error状态:为了重新使用错误状态的MediaPlayer对象使它错误状态下恢复,可以呼叫reset()来把这个对象恢复到Idle状态

3、Initialized状态:调用setDataSource(FileDescriptor), 或setDataSource(String), 或setDataSource (Context, Uri), 或setDataSource(FileDescriptor, long, long)使一个处于Idle状态的MediaPlayer对象切换到Initialized状态

4、Prepared状态:一个MediaPlayer对象必须先进入Prepared状态才能进入Started状态

        有两种方式(同步和异步)可以使MediaPlayer对象达到Prepared(准备)状态

        1)调用prepare()(同步的)方法,当这个方法返回的时候MediaPlayer对象转换为Prepare状态

        2)调用prepareAsync() (异步)方法,这个方法先使MediaPlayer对象转换为Prepareing状态

5、Started状态:调用start()方法时,MediaPlayer对象进入Started状态,可以用isPlaying()方法来测试MediaPlayer对象是否处于开始状态。 

6、当播放到达数据流的终点时,播放完成。如果循环模式通过setLooping(boolean)设为true,那么MediaPlayer对象应该会重新进入Started状态。如被设为false,播放引擎会呼叫用户提供的回放方法OnCompletion.onCompletion(),前提是OncompletionListener先前被SetOnCompletionListener(OnCompletionListener)注册过,此时MediaPlayer对象进入PlaybackCompleted 状态,调用start()方法可以重新使MediaPlayer对象进入Started状态

 

安卓MediaPlayer生命周期包括以下几个状态:Idle状态、Initialized状态、Preparing状态、Prepared状态、Started状态、Paused状态、Stopped状态和Released状态。\[1\]\[2\]\[3\] 1. Idle状态:当MediaPlayer通过new方式进行初始化或调用了reset()方法后,它就处于Idle状态。在这个状态下,MediaPlayer对象已经被创建,但还没有设置数据源或调用prepare()方法。 2. Initialized状态:当调用了setDataSource()方法后,MediaPlayer进入Initialized状态。在这个状态下,MediaPlayer已经设置了数据源,但还没有调用prepare()方法进行准备。 3. Preparing状态:当调用了prepare()方法后,MediaPlayer进入Preparing状态。在这个状态下,MediaPlayer正在准备音频/视频资源,包括缓冲数据和初始化解码器等操作。 4. Prepared状态:当音频/视频资源准备完成后,MediaPlayer进入Prepared状态。在这个状态下,MediaPlayer已经准备好开始播放,可以调用start()方法开始播放。 5. Started状态:当调用了start()方法后,MediaPlayer进入Started状态。在这个状态下,MediaPlayer正在播放音频/视频。 6. Paused状态:当调用了pause()方法后,MediaPlayer进入Paused状态。在这个状态下,MediaPlayer暂停播放,可以调用start()方法继续播放。 7. Stopped状态:当调用了stop()方法后,MediaPlayer进入Stopped状态。在这个状态下,MediaPlayer停止播放,并且需要调用prepare()方法重新准备资源才能再次播放。 8. Released状态:当调用了release()方法后,MediaPlayer进入Released状态。在这个状态下,MediaPlayer已经释放了所有资源,不能再进行任何操作。 需要注意的是,MediaPlayer生命周期是基于状态的,不同的方法只能在特定的状态下调用。比如,只有在Prepared状态下才能调用start()方法开始播放。正确地管理MediaPlayer生命周期可以确保音频/视频的正常播放和资源的释放。 #### 引用[.reference_title] - *1* *2* *3* [Android MediaPlayer生命周期分析](https://blog.csdn.net/qijingwang/article/details/104973432)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值