Activity 横竖屏切换
2016-04-15 14:06
190 查看
前言
在开发中常要处理横竖屏切换,怎么处理先看生命周期申明
Activity横竖屏切换时需要回调两个函数,所以在此将这个两个函数暂时看成是Activity横竖屏切换的生命周期的一部分,这两个函数如下onSaveInstanceState(BundleoutState):Activity即将销毁时保存数据
onRestoreInstanceState(BundlesavedInstanceState):Activity重建或者恢复时候取出数据
横竖屏切换生命周期
1、启动程序进入Activity界面
2、旋转屏幕
3、再次旋转屏幕
4在AndroidManifest.xml中设置android:configChanges="orientation|screenSize",切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
注意:
MiniSdkVersion大于等于13时候:android:configChanges="orientation"或者android:configChanges="orientation|keyboardHidden"重新调用各个生命周期MiniSdkVersion小于13时候:
(1)不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
(2)设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
(3)设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
5、屏幕切换避免,重走Activity生命周期
从上面屏幕切换生命周期可以看出每次切换都在重新创建,为了不必要的麻烦比如视频播放屏幕旋转等,避免重走生命周期就是一个比较好的解决方案(1)android2.3之前的版本android:configChanges="orientation|keyboardHidden"
(2)android3.0之后的版本android:configChanges="orientation|screenSize"
横竖屏设置
Android横竖屏切换在手机开发中比较常见,很多软件在开发过程中为了避免横竖屏切换时引发不必要的麻烦,通常禁止掉横竖屏的切换。一、在AndroidManifest.xml中设置activity中的android:screenOrientation属性值来实现。
(1)竖屏:android:screenOrientation="portrait"
(2)横屏:android:screenOrientation="landscape"
二、在Java代码中通过类似如下代码来设置(不推荐这种方法,在大的app不同方向启动时会慢)
(1)竖屏:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
(2)横屏:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
三、如果要彻底禁止翻转,忽略重力感应带来的切换,(模拟器上不管用,在真机上是正确的)
(1)忽略重力:android:screenOrientation="nosensor"
横竖屏辨识
一、在onConfigurationChanged里判断,为了onConfigurationChanged在监听屏幕方向变化有效需要以下条件
(1)AndroidManifest.xml增加权限:<uses-permissionandroid:name="android.permission.CHANGE_CONFIGURATION"></uses-permission>(2)AndroidManifest.xml里设置的MiniSdkVersion和TargetSdkVersion属性大于等于13
(3)在AndroidManifest.xml的Activity里增加:android:configChanges="keyboard|screenSize|orientation|layoutDirection"
(4)在onConfigurationChanged(ConfigurationnewConfig)进行判断
@Override publicvoidonConfigurationChanged(ConfigurationnewConfig){ super.onConfigurationChanged(newConfig);
if(newConfig.orientation==1)//竖屏
if(newConfig.orientation==2)//横屏 }
二、因为当屏幕变为横屏的时候,系统会重调用Activity的onCreate方法可以在onCreate中来检查当前的方向,然后可以让你的setContentView来载入不同的layoutxml。
if(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_LANDSCAPE){
Log.i("info","landscape");//横屏
}elseif(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_PORTRAIT){
Log.i("info","portrait");//竖屏
}
注意:该方法是在AndroidManifest.xml中不设置onConfigurationChanged才能重走生命周期
横竖屏切换布局文件设置
如果要让软件在横竖屏之间切换,由于横竖屏的高宽会发生转换,有可能会要求不同的布局。可以通过以下方法来切换布局(1)在res目录下建立layout-land和layout-port目录,相应的layout文件名称不变,比如main.xml。layout-land是横屏的layout,layout-port是竖屏的layout,其他的不用管,模拟器会自动寻找。
(2)在上面横竖屏辨识中,如果横竖屏出现变化,在onCreate()或者onConfigurationChanged()判断方向,就可以在相应的方法中重新setContentView来载入不同的layoutxml布局文件
横竖屏切换数据保存与读取
另外,android中每次屏幕的切换动会重启Activity,所以应该在Activity销毁前保存当前活动的状态,在Activity再次Create的时候载入配置,那样,进行中的游戏就不会自动重启了!Activity数据保存
(1)如果因为系统资源紧张而导致Activity的Destory或者旋转屏幕时被destroyed与Recreated,系统会在用户回到这个Activity时有这个Activity存在过的记录,系统会使用那些保存的记录数据(instancestate)它是一些存放在Bundle对象中的key-valuepairs,系统默认使用Bundle保存信息(2)为了可以保存额外更多的数据到instancestate,要重写写这个回调函数onSaveInstanceState(BundleoutState),系统会在Activity被异常Destory时传递Bundle对象,这样我们就可以增加额外的信息到Bundle中并保存到系统中。若系统在Activity被Destory之后想重新创建这个Activity实例时,之前的Bundle对象会(系统)被传递到你我们activity的
(3)Activity开始stop,系统会调用onSaveInstanceState(BundleoutState),Activity可以用键值对的集合来保存状态信息。这个方法会默认保存Activity视图的状态信息,如在EditText组件中的文本或ListView的滑动位置
Activity数据恢复
(1)当Activity从Destory中重建,我们可以从系统传递的Activity的Bundle中恢复保存的状态。onCreate()与onRestoreInstanceState()回调方法都接收到了同样的Bundle,里面包含了同样的实例状态信息。(2)由于onCreate()方法会在第一次创建新的Activity实例与重新创建之前被Destory的实例时都被调用,我们必须在尝试读取Bundle对象前检测它是否为null。如果它为null,系统则是创建一个新的Activity实例,而不是恢复之前被Destory的Activity。
(3)也可以选择实现onRestoreInstanceState(),而不是在onCreate方法里面恢复数据。onRestoreInstanceState()方法会在onStart()方法之后执行.系统仅仅会在存在需要恢复的状态信息时才会调用onRestoreInstanceState(),因此不需要检查Bundle是否为null。
相关文章推荐
- php中ajax实战购物车添加商品
- ThinkPHP框架搭建及常见问题(XAMPP安装失败、Apache/MySQL启动失败)
- 如何调整压力测试工具
- HTTP协议详解
- 面试题03:反转链表
- AjaxUploader使用
- 基于单目视觉的智能车辆视觉导航系统设计
- 东汤镇纪行
- AjaxUploader使用
- 四、Android Studio使用——什么样的Project都能导入Studio
- time .h 的用法
- 【BZOJ4325】NOIP2015 斗地主【搜索】【剪枝】
- iOS 版本更新迭代
- viewpager实现Tab
- HTTP 表单编码 enctype
- CDOJ 1139 菲波拉契数制升级版 dp
- 继 <ZMQ的学习和研究> 学习代码 Multiple socket reader in C++
- Mybatis-Spring整合
- oracle lag与lead分析函数简介
- 适配item的不同高度决定ListView的高度