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

前言

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

申明

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 横竖屏切换的生命周期的相关知识,希望对大家有所帮助!

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android横竖屏切换
activity横竖屏
横竖屏切换生命周期、横竖屏切换的生命周期、activity切换生命周期、activity横竖屏切换、activity 生命周期,以便于您获取更多的相关知识。

时间: 2024-10-30 05:53:20

Android Activity 横竖屏切换的生命周期_Android的相关文章

Android(2.2/2.3系统)Gallery解决默认和横竖屏切换选中状态问题_Android

前言  Gallery的Item使用的是一个ImageView+TextView,并且为其设置了selector,当使用setSelection设置时.横竖屏切换时Item的状态不会改变,这个目前在2.2/2.3系统中存在,高版本如4.0是不存在的. 正文  一.第一步,解决ImageView的状态问题   为ImageView设置  :android:focusableInTouchMode="true"   注意同样属性设置TextView不管用.  二.第二步,手动控制文本根据状

android中Activity横竖屏切换的那些事

讲解之前需要说明的是 旋转屏幕:在系统的自动旋转屏幕开启的情况下,我们旋转屏幕 手动设置屏幕:我们自己去调用Activity的 setRequestedOrientation 方法. 设置屏幕的方向 简介 值 描述 unspecified 默认值.系统自动选择屏幕方向 behind 跟activity堆栈中的下面一个activity的方向一致 landscape 横屏方向,显示的宽比高长 portrait 竖屏方向,显示的高比宽长 sensor 由设备的物理方向传感器决定,如果用户旋转设备,这屏

android mms-Android横竖屏切换问题

问题描述 Android横竖屏切换问题 开发Mms时,横竖屏切换引发会话列表显示异常,如图http://img.bbs.csdn.net/upload/201409/11/1410436614_362623.pnglistview像是加载了两次但又不完整,而且并不是每次切换都会引发问题,但是多次切换必然引发这个问题,如果禁止横竖屏切换时重新加载Activity就没问题,那么 请问允许重新加载的情况下该如何解决 求大神指导,这是什么原因

android 判断横竖屏问题的详解_Android

Android横竖屏要解决的问题应该就两个:一.布局问题:二.重新载入问题.1.布局问题:如果不想让软件在横竖屏之间切换,最简单的办法就是在项目的 AndroidManifest.xml中找到你所指定的activity中加上android:screenOrientation属性,他有以下几个参数:"unspecified" 默认值 由系统来判断显示方向.判定的策略是和设备相关的,所以不同的设备会有不同的显示方向. "landscape" 横屏显示(宽比高要长) &q

关于Android横竖屏切换及Activity重启周期的总结

禁止Android横竖屏和解决切换屏幕时重启Activity的方法 1.在AndroidManifest.xml的Activity配置中加入 android:screenOrientation="landscape"属性(landscape是横向,portrait是纵向).如: <activity android:name=".ContactsManagerActivity" android:label="@string/app_name"

android开发-Android 里把Activity伪装成Dialog后此Activity不能横竖屏切换?

问题描述 Android 里把Activity伪装成Dialog后此Activity不能横竖屏切换? Android 里把Activity伪装成Dialog后此Activity就不能横竖屏切换了?也不能回调onConfigurationChanged. 还有什么办法能使伪装的dialog 监听到手机横竖屏的变化么 解决方案 就用Activity,不可以吗~实现什么效果~ 解决方案二: 就用Activity,不可以吗~实现什么效果~ 解决方案三: 伪装成....还是Acticvitiy. 解决方案

Android编程实现横竖屏切换时不销毁当前activity和锁定屏幕的方法_Android

本文实例讲述了Android编程实现横竖屏切换时不销毁当前activity和锁定屏幕的方法.分享给大家供大家参考,具体如下: 首先在Mainifest.xml的Activity元素中加入android:configChanges="orientation|keyboardHidden"属性 <activityandroid:name=".FileBrowser"android:label="@string/app_name"android:

解决Android横竖屏切换数据丢失问题的方法_Android

Android横竖屏切换时,当前的Activity会被销毁,然后Activity上面的数据将会全部丢失. 如Listview上面每个item的checkbox,横竖屏切换时,复选框就丢失所有选中信息. 解决方案1:在Androidmanifest.xml的activity标签中加入android:configChanges="orientation|keyboardHidden" <activity android:configChanges="orientation|

横竖屏 切换-Android横竖屏切换有什么差别呢?

问题描述 Android横竖屏切换有什么差别呢? 个人感觉Android的横竖屏切换是因为重力的感应,之后软件的布局会改变, 但是横竖屏切换的具体差别是什么? 解决方案 页面:页面会重新加载,只要你的布局不是绝对.写死的,通常会自动适应,一般不会出现大问题. 数据:安卓内置的bundle会帮你保存一些系统认为比较重要的数据,还有一些数据是可能会丢失,需要你自己手动保存(具体查看onSaveInstance()等方法) 解决方案二: 页面会重新加载的,因为如果你不在Mainfest.xml文件中配