Android横竖屏切换引起问题的小结
终于下定决心好好写(抄)写(抄)属于自己的博客了,以前总是懒惰,总是不肯行动,要知道这个世界永远不会为你而改变,我们只有改变自己。碎语少说,言归正传。
关于Android应用横竖屏的切换所引起的问题以及解决的方法,我以前老大也曾不止一次问过我,而我却从没有认真思考、回答过他,现在我借此做个总结。
1.所引起的问题
1、不设置Activity的Android: configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次。
2、设置Activity的android: configChanges=“orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次。
3、设置Activity的android: configChanges=“orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfiguration方法
因此,如果放任应用得横竖屏切换而不管的话,首先Activity每次横竖屏切换(包括用setRequestedOrientation调用)都会重新调用一轮onPause-> onStop-> onDestory-> onCreate->onStart->onResume操作,从而销毁原来的Activity对象,创建新的Activity对象,造成内存得开销;另外,如果在刷新界面得事后没有保存用户数据很可能导致数据得丢失。
2.解决的方法
1.禁止APP内横竖屏切换
我入职得第一家公司是主营平板业务,所以大部分应用为了避免麻烦直接禁止了应用得横竖屏切换,very good。具体做法如下:
android:screenOrientation="portrait"
则无论手机如何变动,拥有这个属性的activity都将是竖屏显示。
android:screenOrientation="landscape"
,为横屏显示。
上述修改也可以在Java代码中通过类似如下代码来设置
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
另外android:screenOrientation属性,他有以下几个参数:
“unspecified”:默认值 由系统来判断显示方向.判定的策略是和设备相关的,所以不同的设备会有不同的显示方向.
“landscape”:横屏显示(宽比高要长)
“portrait”:竖屏显示(高比宽要长)
“user”:用户当前首选的方向
“behind”:和该Activity下面的那个Activity的方向一致(在Activity堆栈中的)
“sensor”:有物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换。
“nosensor”:忽略物理感应器,这样就不会随着用户旋转设备而更改了(”unspecified”设置除外)。
2.重启Activity的横竖屏切换的处理
1)在res目录下建立layout-land和layout-port目录,相应的layout文件名不变,比如main.xml。layout-land是横屏的layout,layout-port是竖屏的layout,其他的不用管,横竖屏切换时程序自己会调用Activity的onCreate方法,从而根据当前横竖屏情况自动加载响应的布局。
2)假如布局资源是不一样又不按照如上设置,则需要通过java代码来判断当前是横屏还是竖屏然后来加载相应的xml布局文件(比如mainP为竖屏ma