由Android屏幕旋转说起

简单来说,Activity作为负责与用户交互最主要的机制,任何的Configuration的变化都可能会对Activity的界面造成影响,这时系统会销毁Activity重新创建一个实例来反映最新的Configuration。比如今天要说的“屏幕旋转”,还有明天要说的“语言切换”。

在AndroidMainfest.xml文件中配置Activity时,会有这一属性android:screenOrientation="sensor"。绝大多数应用只会使用它的两个属性值,横向(lanscape)和 纵向(portrait)。横向一般的游戏APP和视频播放界面会使用比较大,而大多数情况下,我们程序员遇到的情况就是portrait了。前面的sensor,顾名思义,表示APP的屏幕方向由传感器决定,可以是横向,也可以是纵向。

但是如果在这里把android:screenOrientation属性设置为sensor,又不在代码中进行一定的控制,会出现不妙的情况。举个例子,用户正在这个页面填写表单,如果处理不当,用户会发现屏幕旋转后表单页面变空,这是非常影响用户体验的。再比如,我正在使用手机观看视频,屏幕旋转后会重新缓冲视频数据,同时重头播放,这是比较让人恼火的事情。我就曾经在我4.3系统的手机上遇到这种情况,搞了好久才解掉这个bug。

好了,背景介绍完毕。那现在说说我在遇到屏幕旋转时的三个解决方案吧。

第一种、禁止屏幕旋转

第二种、旋转屏幕后恢复现场数据

我们可以在OnPause()方法中,先把数据存储到数据库或者Prefrence中,然后再在OnCreate()里面获取到。也可以使用下面两个简单的办法。

保存数据:

由Android屏幕旋转说起


重建现场:

由Android屏幕旋转说起


但是这一种方案在页面加载数据较多以及绘图操作比较频繁的情况下,是比较坑爹的。因为我们需要把原来辛辛苦苦加载出来的页面Destroy掉,重新来过。


最后一种方案:最简单的方案

看了以上的背景,那就有同学会问了,Android官方有没有提供这么一种方案呢,既能满足屏幕旋转的需求,又能不重新绘制页面。不用担心了,答案是肯定的,请相信万能的google吧。请见下图。

由Android屏幕旋转说起

但是这个最简单的方案照实把我给坑了一把,让我再一次见识到不同版本之间的碎片化的严重,话说上面我提到过的我的4.3机器。原先4.0之前,我们只须设置

android:configChanges="orientation|keyboardHidden"就能完成顺滑的切换。而在4.0系统之后呢,就需要新增一个screenSize属性值。就这一点的差异,还以为哪里出了问题,各种查,浪费了不少的时间。看到没有,就是如此的简单,就是如此的顺滑,我的视频播放页面也终于不那么坑了。


如果觉得对你有所帮助,欢迎大家订阅我的微信公众账号——Android干货分享。下面是微信的二维码,为你提供及时高质的Android干货。

由Android屏幕旋转说起


你可能感兴趣的:(由Android屏幕旋转说起)