`
xwangly
  • 浏览: 132086 次
  • 性别: Icon_minigender_1
  • 来自: 鄂州
社区版块
存档分类
最新评论

Android MediaPlayer的生命周期

阅读更多

Android MediaPlayer 的生命周期

MediaPlayer 的状态转换图也表征了它的生命周期,搞清楚这个图可以帮助我们在使用 MediaPlayer 时考虑情况更周全,写出的代码也更具健壮性。

 


 

这张状态转换图清晰的描述了 MediaPlayer 的各个状态,也列举了主要的方法的调用时序,每种方法只能在一些特定的状态下使用,如果使用时 MediaPlayer 的状态不正确则会引发 IllegalStateException 异常

 

Idle 状态: 当使用 new() 方法创建一个 MediaPlayer 对象或者调用了其 reset() 方法时,该 MediaPlayer 对象处于 idle 状态。这两种方法的一个重要差别就是:如果在这个状态下调用了 getDuration() 等方法(相当于调用时机不正确),通过 reset() 方法进入 idle 状态的话会触发 OnErrorListener.onError() ,并且 MediaPlayer 会进入 Error 状态;如果是新创建的 MediaPlayer 对象,则并不会触发 onError(), 也不会进入 Error 状态。

 

End 状态: 通过 release() 方法可以进入 End 状态,只要 MediaPlayer 对象不再被使用,就应当尽快将其通过 release() 方法释放掉,以释放相关的软硬件组件资源,这其中有些资源是只有一份的(相当于临界资源)。如果 MediaPlayer 对象进入了 End 状态,则不会在进入任何其他状态了。

 

Initialized 状态: 这个状态比较简单, MediaPlayer 调用 setDataSource() 方法就进入 Initialized 状态,表示此时要播放的文件已经设置好了。

 

Prepared 状态: 初始化完成之后还需要通过调用 prepare() prepareAsync() 方法,这两个方法一个是同步的一个是异步的,只有进入 Prepared 状态,才表明 MediaPlayer 到目前为止都没有错误,可以进行文件播放。

 

Preparing 状态: 这个状态比较好理解,主要是和 prepareAsync() 配合,如果异步准备完成,会触发 OnPreparedListener.onPrepared() ,进而进入 Prepared 状态。

 

Started 状态: 显然, MediaPlayer 一旦准备好,就可以调用 start() 方法,这样 MediaPlayer 就处于 Started 状态,这表明 MediaPlayer 正在播放文件过程中。可以使用 isPlaying() 测试 MediaPlayer 是否处于了 Started 状态。 如果播放完毕,而又设置了循环播放,则 MediaPlayer 仍然会处于 Started 状态,类似的,如果在该状态下 MediaPlayer 调用了 seekTo() 或者 start() 方法均可以让 MediaPlayer 停留在 Started 状态。

 

Paused 状态: Started 状态下 MediaPlayer 调用 pause() 方法可以暂停 MediaPlayer ,从而进入 Paused 状态, MediaPlayer 暂停后再次调用 start() 则可以继续 MediaPlayer 的播放,转到 Started 状态,暂停状态时可以调用 seekTo() 方法,这是不会改变状态的。

 

Stop 状态: Started 或者 Paused 状态下均可调用 stop() 停止 MediaPlayer ,而处于 Stop 状态的 MediaPlayer 要想重新播放,需要通过 prepareAsync() prepare() 回到先前的 Prepared 状态重新开始才可以。

 

PlaybackCompleted 状态: 文件正常播放完毕,而又没有设置循环播放的话就进入该状态,并会触发 OnCompletionListener onCompletion() 方法。此时可以调用 start() 方法重新从头播放文件,也可以 stop() 停止 MediaPlayer ,或者也可以 seekTo() 来重新定位播放位置。

 

Error 状态: 如果由于某种原因 MediaPlayer 出现了错误,会触发 OnErrorListener.onError() 事件,此时 MediaPlayer 即进入 Error 状态,及时捕捉并妥善处理这些错误是很重要的,可以帮助我们及时释放相关的软硬件资源,也可以改善用户体验。通过 setOnErrorListener(android.media.MediaPlayer.OnErrorListener) 可以设置该监听器。如果 MediaPlayer 进入了 Error 状态,可以通过调用 reset() 来恢复,使得 MediaPlayer 重新返回到 Idle 状态。

 

参考文档: AndroidSDK1.5 官方文档: android-sdk-windows-1.5_r3/docs/reference/android/media/MediaPlayer.html

分享到:
评论

相关推荐

    Android MediaPlayer 自定义循环次数

    具体来说,我们可以在MediaPlayer的生命周期管理中加入计数器,每次播放结束后根据计数器的值决定是否再次启动MediaPlayer。 #### 2.2 示例代码解析 下面是一段基于给定部分代码的详细解析: ```java private ...

    Android MediaPlayer使用方法简单介绍

    合理管理生命周期,确保在一个`MediaPlayer`停止并释放资源后再启动另一个。 文档如`MediaPlayer2.docx`和`MediaPlayer.docx`可能提供了更详细的API参考和示例代码。而`Android MediaPlayer使用方法简单介绍.docx`...

    玩转 Android MediaPlayer之视频预加载(优化)

    开发者可以通过监听Activity或Fragment的生命周期,以及监听MediaPlayer的事件(如`OnBufferingUpdateListener`)来决定何时开始预加载。 3. **预加载策略**:预加载策略包括预先加载多少数据、何时停止加载等。...

    传智播客_Andorid_20天精通Android开发视频_第14天视频_视频_14_MediaPlayer生命周期

    传智播客_Andorid_20天精通Android开发视频_第14天视频_视频_14_MediaPlayer生命周期.avi

    Android下MediaPlayer播放MP3示例

    首先,我们需要了解`MediaPlayer`的基本生命周期。它的主要阶段包括初始化、准备、播放、暂停、停止和释放。当创建`MediaPlayer`对象时,通常需要调用`setDataSource()`方法指定要播放的MP3文件路径。路径可以是本地...

    Android MediaPlayer Playback---多媒体开发应用程序接口

    - 在Activity或Fragment的生命周期中,需要适当地释放`MediaPlayer`资源,防止内存泄漏。通常在`onDestroy()`或`onStop()`中调用`release()`。 8. **多媒体格式支持**: - Android系统默认支持MP3、AAC、AMR、WAV...

    Android MediaPlayer简单音乐播放器

    7. **生命周期管理** 在Activity的`onCreate()`、`onStart()`、`onResume()`方法中启动或恢复播放,在`onPause()`、`onStop()`、`onDestroy()`中暂停、释放资源。确保在不使用时正确释放`MediaPlayer`对象,避免...

    android mediaPlayer demo

    ### 生命周期管理 为了防止内存泄漏,必须在不再使用`MediaPlayer`时正确释放资源。当播放结束或手动停止时,调用`release()`。 ```java mediaPlayer.release(); mediaPlayer = null; ``` ### 事件监听 `...

    Android 使用MediaPlayer高级

    首先,`MediaPlayer`的生命周期管理是关键。它包含了初始化、准备、播放、暂停、停止和释放等阶段。创建`MediaPlayer`实例后,需要调用`setDataSource()`指定要播放的媒体源,可以是本地文件路径、网络URL或者是资源...

    Android MediaPlayer 播放器(修改版)

    在这个项目中,我们可以看到如何设置`MediaPlayer`,如何处理`SurfaceView`的生命周期,以及如何响应用户操作进行播放控制。 总的来说,掌握`MediaPlayer`和`SurfaceView`的使用是Android开发中的重要技能,特别是...

    Android MediaPlayer

    2. 生命周期管理: - `prepare() / prepareAsync()`:准备MediaPlayer,使其能够开始播放。`prepareAsync()`是异步准备,适合处理大文件或网络流。 - `start()`:开始播放。 - `pause()`:暂停播放。 - `stop()`...

    一款简单的 android mediaplayer 播放器 源码

    在Activity或Fragment的生命周期中,记得在暂停、销毁或配置改变时释放MediaPlayer资源,以防止内存泄漏。 7. 用户界面: 源码可能包括一个简单的用户界面,展示播放、暂停、前进、后退等控制按钮,以及音量调节...

    android Mediaplayer 视频播发器

    综上所述,使用Android的Mediaplayer类开发视频播放器涉及的知识点包括Mediaplayer的生命周期管理、视频文件的加载、播放控制、错误处理以及用户界面的实现。通过理解这些要点,开发者能够创建出稳定、功能完善的...

    MediaPlayer(Android音视频播放器)

    在Activity或Fragment的生命周期中,需要适当地释放MediaPlayer资源。在`onPause()`或`onStop()`中调用`release()`,确保不会泄漏资源。 ```java @Override protected void onPause() { super.onPause(); if ...

    安卓Android源码——(MediaPlayer音乐).rar

    6. **生命周期管理**:由于`MediaPlayer`对象需要大量的系统资源,因此在不再使用时,必须调用`release()`方法释放资源,避免内存泄漏。 7. **其他高级特性**:如循环播放、音轨选择、快进/后退、音效处理等。 在...

    Android MediaPlayer和SurfaceView的简单应用

    // 其他生命周期方法... } ``` 在这个例子中,我们创建了一个VideoActivity,设置了SurfaceView并实现了SurfaceHolder.Callback。在`onCreate()`方法中初始化MediaPlayer和SurfaceView,然后在`surfaceCreated()`...

Global site tag (gtag.js) - Google Analytics