android项目开发思考 (android开发一般都使用什么)

android开发需要多少时间,android项目开发思考

这里推荐下我们的Android开发技术免费直播群:517269161,不管你是小白还是大牛,我都挺欢迎,不定期分享干货,每天直播分享技能,包括2017最新的Android企业案例学习资料和零基础入门教程和科技前沿技术,欢迎初学和进阶中的小伙伴,大家一起交流学习,共同进步前言,

记得分享和关注我哦

成功者和其他人最大的区别就是,他们真正动手去做了。

MediaPlayer类可以用来*放播**音频、视频和流媒体。MediaPlayer包含了Audio和Video的*放播**功能,在Android界面上,Music和Video两个应用程序都是调用MediaPlayer来实现的。首先来看看MediaPlayer的生命周期。

MediaPlayer生命周期图

椭圆代表MediaPlayer对象可能驻留的态势。弧线表示驱动MediaPlayer在各个态势之间迁移的*放播**控制操作。这里有两种类型的弧线。由一个箭头开始的弧代表同步的方法调用,而以双箭头开头的代表的弧线代表异步方法调用。

MediaPlayer是基于态势的,只有在特定态势才能执行特定的方法。所以认清MediaPlayer生命周期十分重要的。

1、当MediaPlayer通过new方式进行初始化或MediaPlayer调用了reset()方法后,它就处于Idle态势。当调用了release()方法后,它就处于End态势。这两种态势之间是MediaPlayer对象的生命周期。

1.1、在一个新构建的MediaPlayer对象和一个调用了reset()方法的MediaPlayer对象之间有一个微小的但是十分重要的差别。

在处于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()方法了,并将错误的态势传入。

1.2、一旦一个MediaPlayer对象不再被使用,应立即调用release()方法来释放在内部的*放播**引擎中与这个MediaPlayer对象关联的资源。资源可能包括如硬件加速组件的单态组件,若没有调用release()方法可能会导致之后的MediaPlayer对象实例无法使用这种单态硬件资源,从而退回到软件实现或运行失败。一旦MediaPlayer对象进入了End态势,它不能再被使用,也没有办法再迁移到其它态势。

1.3、使用new操作符创建的MediaPlayer对象处于Idle态势,而那些通过重载的create()便利方法创建的MediaPlayer对象却不是处于Idle态势。事实上,如果成功调用了重载的create()方法,那么这些对象已经是Prepare态势了。

2、在 一般情况下,由于种种原因一些*放播**控制操作可能会失败,如不支持的音频/视频格式,缺少隔行扫描的音频/视频,分辨率太高,流超时等等。因此,错误报告和恢复在这种情况下是非常重要的。有时,由于编程错误,在处于无效态势的情况下调用了一个*放播**控制操作可能发生。在所有这些错误条件下,内部的*放播**引擎会调用一个由客户端程序员提供的OnErrorListener.onError()方法。客户端程序员可以通过调用 MediaPlayer.setOnErrorListener(android.media.MediaPlayer.OnErrorListener)方法来注册OnErrorListener。

2.1、一旦发生错误,MediaPlayer对象会进入到Error态势。

2.2、为了重用一个处于Error态势的MediaPlayer对象,可以调用reset()方法来把这个对象恢复成Idle态势。

2.3、注册一个OnErrorListener来获知内部*放播**引擎发生的错误是好的编程习惯。

2.4、在不合法的态势下调用一些方法,如prepare(),prepareAsync()和setDataSource()方法会抛出IllegalStateException异常。

3、调 用setDataSource(FileDescriptor)方法,或setDataSource(String)方法,或 setDataSource(Context,Uri)方法,或setDataSource(FileDescriptor,long,long)方法会使处于Idle态势的对象迁移到Initialized态势。

3.1、若当此MediaPlayer处于其它的态势下,调用setDataSource()方法,会抛出IllegalStateException异常。

3.2、好的编程习惯是不要疏忽了调用setDataSource()方法的时候可能会抛出的IllegalArgumentException异常和IOException异常。

4、在开始*放播**之前,MediaPlayer对象必须要进入Prepared态势。

4.1、有两种方法(同步和异步)可以使MediaPlayer对象进入Prepared态势:要么调用prepare()方法(同步),此方法返回就表示该MediaPlayer对象已经进入了Prepared态势;要么调用prepareAsync()方法(异步),此方法会使此MediaPlayer对象进入Preparing态势并返回,而内部的*放播**引擎会继续未完成的准备工作。当同步版本返回时或异步版本的准备工作完全完成时就会调用客户端程序员提供的OnPreparedListener.onPrepared()监听方法。可以调用MediaPlayer.setOnPreparedListener(android.media.MediaPlayer.OnPreparedListener)方法来注册OnPreparedListener。

4.2、Preparing是一个中间态势,在此态势下调用任何具备影响的方法的结果都是未知的!

4.3、在不合适的态势下调用prepare()和prepareAsync()方法会抛出IllegalStateException异常。当MediaPlayer对象处于Prepared态势的时候,可以调整音频/视频的属性,如音量,*放播**时是否一直亮屏,循环*放播**等。

5、要开始*放播**,必须调用start()方法。当此方法成功返回时,MediaPlayer的对象处于Started态势。isPlaying()方法可以被调用来测试某个MediaPlayer对象是否在Started态势。

5.1、当处于Started态势时,内部*放播**引擎会调用客户端程序员提供的OnBufferingUpdateListener.onBufferingUpdate()回调方法,此回调方法允许应用程序追踪流*放播**的缓冲的态势。

5.2、对一个已经处于Started 态势的MediaPlayer对象调用start()方法没有影响。

6、*放播**可以被暂停,停止,以及调整当前*放播**位置。当调用pause()方法并返回时,会使MediaPlayer对象进入Paused态势。关注 Started与Paused态势的相互转换在内部的*放播**引擎中是异步的。所以可能需要一点时间在isPlaying()方法中更新态势,若在*放播**流内 容,这段时间可能会有几秒钟。

6.1、调用start()方法会让一个处于Paused态势的MediaPlayer对象从之前暂停的地方恢复*放播**。当调用start()方法返回的时候,MediaPlayer对象的态势会又变成Started态势。

6.2、对一个已经处于Paused态势的MediaPlayer对象pause()方法没有影响。

7、调用stop()方法会停止*放播**,并且还会让一个处于Started,Paused,Prepared或PlaybackCompleted态势的MediaPlayer进入Stopped态势。

7.1、对一个已经处于Stopped态势的MediaPlayer对象stop()方法没有影响。

8、调用seekTo()方法可以调整*放播**的位置。

8.1、seekTo(int)方法是异步执行的,所以它可以马上返回,但是实际的定位*放播**操作可能需要一段时间才能完成,尤其是*放播**流情势的音频/视频。当实际的定位*放播**操作完成之后,内部的*放播**引擎会调用客户端程序员提供的OnSeekComplete.onSeekComplete()回调方法。可以通过setOnSeekCompleteListener(OnSeekCompleteListener)方法注册。

8.2、关注,seekTo(int)方法也可以在其它态势下调用,比如Prepared,Paused和PlaybackCompleted态势。此外,目前的*放播**位置,实际可以调用getCurrentPosition()方法得到,它可以帮助如音乐*放播**器的应用程序不断更新*放播**进度

9、当*放播**到流的末尾,*放播**就完成了。

9.1、如果调用了setLooping(boolean)方法开启了循环模式,那么这个MediaPlayer对象会重头进入Started态势。

9.2、若没有开启循环模式,那么内部的*放播**引擎会调用客户端程序员提供的OnCompletion.onCompletion()回调方法。可以通过调用MediaPlayer.setOnCompletionListener(OnCompletionListener)方法来设置。内部的*放播**引擎一旦调用了OnCompletion.onCompletion()回调方法,说明这个MediaPlayer对象进入了PlaybackCompleted态势。

9.3、当处于PlaybackCompleted态势的时候,可以再调用start()方法来让这个MediaPlayer对象再进入Started态势。