在开发中常要处理横竖屏切换,怎么处理先看生命周期android
Activity 横竖屏切换时须要回调两个函数 ,因此在此将这个两个函数暂时当作是Activity 横竖屏切换的生命周期的一部分,这两个函数以下app
onSaveInstanceState(Bundle outState) :Activity 即将销毁时保存数据
onRestoreInstanceState(Bundle savedInstanceState) : Activity 重建或者恢复时候取出数据
MiniSdkVersion大于等于 13 时候:android:configChanges="orientation" 或者 android:configChanges="orientation|keyboardHidden" 从新调用各个生命周期ide
MiniSdkVersion小于 13 时候:函数
(1)不设置Activity的android:configChanges时,切屏会从新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次布局
(2)设置Activity的android:configChanges="orientation"时,切屏仍是会从新调用各个生命周期,切横、竖屏时只会执行一次this
(3)设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会从新调用各个生命周期,只会执行onConfigurationChanged方法3d
从上面屏幕切换生命周期能够看出每次切换都在从新建立,为了避免必要的麻烦好比视频播放屏幕旋转等,避免重走生命周期就是一个比较好的解决方案视频
(1)android 2.3以前的版本 android:configChanges="orientation|keyboardHidden"xml
(2)android 3.0以后的版本 android:configChanges="orientation|screenSize"对象
Android横竖屏切换在手机开发中比较常见,不少软件在开发过程当中为了不横竖屏切换时引起没必要要的麻烦,一般禁止掉横竖屏的切换。
1、在AndroidManifest.xml中设置activity中的android:screenOrientation属性值来实现。
(1)竖屏:android:screenOrientation="portrait"
(2)横屏:android:screenOrientation="landscape"
2、在Java代码中经过相似以下代码来设置 (不推荐这种方法,在大的app不一样方向启动时会慢)
(1)竖屏: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
(2)横屏:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
3、若是要完全禁止翻转,忽略重力感应带来的切换,(模拟器上无论用,在真机上是正确的)
(1)忽略重力:android:screenOrientation="nosensor"
(1)AndroidManifest.xml增长权限:<uses-permission android: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(Configuration newConfig)进行判断
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);if(newConfig.orientation == 1)//竖屏if(newConfig.orientation == 2)// 横屏
}
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
Log.i("info","landscape"); // 横屏
} else if(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来载入不一样的layout xml布局文件
另外,android中每次屏幕的切换动会重启Activity,因此应该在Activity销毁前保存当前活动的状态,在Activity再次Create的时候载入配置,那样,进行中的游戏就不会自动重启了!
(1)若是由于系统资源紧张而致使Activity的Destory或者旋转屏幕时被destroyed与Recreated, 系统会在用户回到这个Activity时有这个Activity存在过的记录,系统会使用那些保存的记录数据(instance state)它是一些存放在Bundle对象中的key-value pairs,系统默认使用 Bundle保存信息
(2)为了能够保存额外更多的数据到instance state,要重写写这个回调函数onSaveInstanceState(Bundle outState),系统会在Activity被异常Destory时传递Bundle对象,这样咱们就能够增长额外的信息到Bundle中并保存到系统中。若系统在Activity被Destory以后想从新建立这个Activity实例时,以前的Bundle对象会(系统)被传递到你咱们activity的
(3)Activity开始stop,系统会调用 onSaveInstanceState(Bundle outState) ,Activity能够用键值对的集合来保存状态信息。这个方法会默认保存Activity视图的状态信息,如在 EditText组件中的文本或 ListView 的滑动位置
(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。