当前位置: 移动技术网 > IT编程>移动开发>Android > Android Activity 横竖屏切换的生命周期

Android Activity 横竖屏切换的生命周期

2019年07月24日  | 移动技术网IT编程  | 我要评论

陈漫个人资料,惠来县邮编,刺杀金正恩插曲

前言

在开发中常要处理横竖屏切换,怎么处理先看生命周期

申明

activity 横竖屏切换时需要回调两个函数 ,所以在此将这个两个函数暂时看成是activity 横竖屏切换的生命周期的一部分,这两个函数如下

onsaveinstancestate(bundle outstate) :activity 即将销毁时保存数据
onrestoreinstancestate(bundle savedinstancestate) : activity 重建或者恢复时候取出数据

横竖屏切换生命周期

1、启动程序进入activity界面

2、

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)android 2.3之前的版本 android:configchanges="orientation|keyboardhidden"

(2)android 3.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-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)// 横屏
}

二、因为当屏幕变为横屏的时候,系统会重调用activity的oncreate方法可以在oncreate中来检查当前的方向,然后可以让你的setcontentview来载入不同的layout xml。

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的时候载入配置,那样,进行中的游戏就不会自动重启了!

activity 数据保存

(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 的滑动位置

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。

以上所述是小编给大家介绍的android activity 横竖屏切换的生命周期的相关知识,希望对大家有所帮助!

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网