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状态。

Android MediaPlayer的生命周期相关推荐

  1. 【Android笔记】Android MediaPlayer的生命周期

    Android MediaPlayer的生命周期 MediaPlayer的状态转换图也表征了它的生命周期,搞清楚这个图可以帮助我们在使用

  2. Android 广播的生命周期

    一:Android 广播的生命周期          一个广播接收者有一个回调方法:void onReceive(Context curContext, Intent broadcastMsg).当一 ...

  3. 深入理解 Android Activity的生命周期

    深入理解 Android Activity的生命周期 2010-10-13 14:08:29|  分类: Android |  标签:周期  调用  activity  android  protec ...

  4. Android笔记 activity生命周期 Tasks and back stack回退栈

    正常打开一个应用,先后调用Activity的onCreate.onStart.onResume 正常退出一个应用,先后调用Activity的onPause.onStop.onDestroy(进程被杀死 ...

  5. HOME键窥探Android的Activity生命周期

    HOME键窥探Android的Activity生命周期 好久没有写技术博客了,前两篇博客写的都是一些自己的所见所闻和心里感受,今天说一说Android中的Activity的生命周期,此篇文章使用HOM ...

  6. Pittkai——Android折叠屏生命周期

    Android折叠屏生命周期 (第一次在CSDN上写文章,随便写写,记录一下) 如今随着手机的发展,屏幕从分屏甚至走上了折叠屏的道路,即将推出的谷歌Android Q系统更是支持了折叠屏,但苦于手头没 ...

  7. android中应用程序生命周期,Android应用程序生命周期中的活动和图标

    面向大众的移动技术,第3部分 为您的Android移动应用程序添加导航样式 安德鲁·格洛弗 2013年7月25日发布 面向大众的移动技术 请期待本系列的后续内容. 请期待本系列的后续内容. 近年来,移 ...

  8. Android SurfaceView的生命周期

    本文利用SurfaceView来实现视频的播放 本文地址:http://www.cnblogs.com/wuyudong/p/5851156.html,转载请注明源地址. 在main.xml布局文件添 ...

  9. MediaPlayer的生命周期和缓冲策略 (源码篇)

    目录 概述 必备的知识体系 MediaPlayer的api MediaPlayer的setDataSource(path: String)流程 MediaPlayer::prepare的调用流程 Me ...

  10. 【Android】Activity生命周期(亲测)

    测试手机:Nexus 5   系统:4.4 一.测试 测试代码: 1 package com.example.androidalarm; 2 3 import android.app.Activity ...

最新文章

  1. 全文翻译(一):TVM: An Automated End-to-End Optimizing Compiler for Deep Learning
  2. Naigos PNP图无法加载最新数据
  3. 北京理工大学信息安全与对抗竞赛----crackme02分析
  4. 主席树 - 可持久化线段树
  5. 设置Apache Hadoop多节点集群
  6. 双足机器人简单步态生成
  7. 2月份Github上很热门的Python项目
  8. 苹果服务两天内经历两次宕机:部分服务受影响 现已修复
  9. 提高JQ效率的一些建议
  10. heroku_如何通过5个步骤在Heroku上部署机器学习UI
  11. Windows C++界面库
  12. 2019春c语言程序设计答案,知到C语言程序设计(2019春)答案全套
  13. es同时支持中文拼音分词(9)
  14. 网卡高可用与负载均衡【team】
  15. [转载]基于Servlet的Google Earth之旅
  16. 北京内推 | 秘塔科技招聘NLP算法工程师(社招校招可转正实习)
  17. 三菱q系列plc 和电脑socket_组态王和三菱Q系列PLC以太网通信
  18. 1.java exception handing
  19. 双线macd指标参数最佳设置_macd线参数如何设置最佳买点,MACD指标的参数设置,MACD参数设置多少最佳...
  20. 中国微量营养素市场趋势报告、技术动态创新及市场预测

热门文章

  1. 排序算法-桶排序(入门级别)
  2. VS2010/MFC编程入门之前言
  3. mac电池损耗百分比怎么查看
  4. 3D几何图形PS笔刷下载安装
  5. Give root password for maintenance (Or press Control-D to continue)
  6. iOS中使用URL Scheme进行App跳转
  7. 如何在Azure中配置SQL Server 2008 R2故障转移群集实例
  8. 为什么redux要返回一个新的state引发的血案
  9. Spring JavaConfig
  10. SFB 项目经验-44-别以为Hyper-V比VMware差太多(仅个人观点,不喜误喷,谢谢)