android实现在横竖屏切换时页面信息不被重置的示例分享
发布时间:2021-06-20 08:45:46
当屏幕转动切换的时候 Android 机制是:
销毁当前屏幕的 Activity ,然后重新开启一个新的适应屏幕改变的 Activity 。
那么,我们该如何在屏幕切换的时候页面信息不被重置呢?
解决实现:
1.在 AnroidMainifest.xml 的 activity 元素中加入:
android:configChanges="orientation|keyboardHidden"
或
android:configChanges="orientation|keyboard|keyboardHidden"
表示在改变屏幕方向、弹出软件盘和隐藏软键盘时,不再去执行 onCreate() 方法,
而是直接执行 onConfigurationChanged() 。
如果不申明此段代码,按照Activity的生命周期,都会去执行一次 onCreate() 方法,
而 onCreate() 方法通常会在显示之前做一些初始化工作。
所以如果改变屏幕方向这样的操作都去执行 onCreate() 方法,就有可能造成重复的初始化,
降低程序效率是必然的了,而且更有可能因为重复的初始化而导致数据的丢失。
这是需要避免的!
2.权限声明:
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"></uses-permission>
API 中说该权限允许我们改变配置信息,但是我们在改变屏幕方向的程序中却并没有用到该权限,是不是相互冲突了呢?
这里我们可以这样认为,当我们声明该权限的的时候,
系统允许我们通过重写 activity 中的 onConfigurationChanged 方法来捕获和修改某些配置信息。
3.在 Java 源代码文件中重写 Activity 中的 onConfigurationChanged 方法:
import android.content.res.Configuration;
// 框架回调函数 onConfigurationChanged 出自 android.content.res.Configuration 包。
// 参数 newConfig - 新设备的配备。
// 当设备配置信息有改动(比如屏幕方向的改变,实体键盘的推开或合上等)时,
// 并且如果此时有 Activity 正在运行,系统会调用这个函数。
// 注意:onConfigurationChanged 只会响应应用程序在 AnroidMainifest.xml 中
// 通过 android:configChanges="配置类型" 指定的配置类型的改动;
// 而对于其他配置的更改,则系统会先销毁当前屏幕的 Activity ,
// 然后重新开启一个新的适应屏幕改变的 Activity 实例。
public void
onConfigurationChanged( Configuration newConfig )
{
// 一定要先调用父类的同名函数,让框架默认函数先处理
// 下面这句一定不能省去,否则将引发:android.app.SuperNotCalledException 异常。
super.onConfigurationChanged( newConfig );
// 检测屏幕的方向:纵向或横向
if ( this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE )
{
// 当前为横屏, 在此处添加额外的处理代码
}
else if ( this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT )
{
//当前为竖屏, 在此处添加额外的处理代码
}
//检测实体键盘的状态:推出或者合上
if ( newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO )
{
// 实体键盘处于推出状态,在此处添加额外的处理代码
}
else if ( newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES )
{
// 实体键盘处于合上状态,在此处添加额外的处理代码
}
}
一、新建一个 Activity ,并把各个生命周期打印出来:
第一步:
运行 Activity ,得到如下信息:
onCreate
onStart
onResume
第二步:
按 crtl + f12 切换成横屏时:
onSaveInstanceState
onPause
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onResume
第三步:
再按 crtl + f12 切换成竖屏时,发现打印了两次相同的信息:
onSaveInstanceState
onPause
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onResume
onSaveInstanceState
onPause
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onResume
第四步:
修改 AndroidManifest.xml 文件中的 Activity 元素,
添加 android:configChanges="orientation" ,
按 crtl + f12 切换成横屏时:(与上面无修改时相同)
onSaveInstanceState
onPause
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onResume
第五步:
再按 crtl + f12 切换成竖屏时,
发现不会再打印相同信息,
但多打印了一行 onConfigChanged :
onSaveInstanceState
onPause
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onResume
onConfigurationChanged
第六步:
修改 AndroidManifest.xml 文件中的 Activity 元素,
把
android:configChanges="orientation"
改成
android:configChanges="orientation|keyboardHidden"
按 crtl + f12 切换成横屏时,
就只打印 onConfigChanged :
onConfigurationChanged
第七步:
按 crtl + f12 切换成竖屏时:
onConfigurationChanged
onConfigurationChanged
二、总结:
1.不设置 AndroidManifest.xml 文件中的 Activity 元素的 android:configChanges 时,
切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次;
2.设置了 AndroidManifest.xml 文件中的 Activity 元素的
android:configChanges="orientation"时,
切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次;
3.设置了 AndroidManifest.xml 文件中的 Activity 元素的
android:configChanges="orientation|keyboardHidden"时,
切屏不会重新调用各个生命周期,只会执行 onConfigurationChanged 方法!
三、补充一点:
1.当前 Activity 产生事件弹出 Toast 和 AlertDialog 的时候 Activity 的生命周期不会有改变!
2.Activity 运行时按下 home 键(跟被完全覆盖是一样的):
onSaveInstanceState --> onPause --> onStop
onRestart --> onStart --> onResume
3.Activity 未被完全覆盖只是失去焦点:
onPause --> onResume
猜你喜欢
- Mybatis-plus全局id生成策略在配置文件中加入以下代码后就不需要在实体类种的id上添加@TableId(value = “id”,
- 反转数组输出前言:此方法来自B站UP主问题:将数字1,2,3,4,5 反向输出 5,4,3,2,1输入参数:1,2,3,4,5代码示例pub
- 本文实例总结了C#中多态、重载与重写的概念与区别。对于初学C#的朋友来说有不错的参考价值。分享给大家供大家参考。具体分析如下:重写:是指重写
- idea手动刷新git分支相信很多小伙伴都遇到过这样的问题,在git上新建的分支却在idea的git分支中找不到又不知在哪里刷新,博主最近也
- SpringCloud Gateway 简介SpringCloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基
- ArrayList集合在查询元素时速度很快,但在增删元素时效率较低,为了克服这种局限性,可以使用List接口的另一个实现类LinkedLis
- 前言今天从github把我以前写的一个小demo下载下来了,第一次下载项目,摸索了一个多小时,才运行起来。下载有两种方法,通过git下载,或
- 一般来说,修改框架的源代码是极其有风险的,除非万不得已,否则不要去修改。但是今天却小心翼翼的重构了Mybatis官方提供的与Spring集成
- 一、使用JDK生成WSDL的对象类1、cmd进入JDK的bin文件中执行命令 wsimport -keep -p com.demo.clie
- 之前的一篇文章中的代码中有一个using的用法,刚开始查看了一些资料说是强制关闭对象的一个命令。今天又查了一些资料,才明白,原来using指
- VAR 是3.5新出的一个定义变量的类型其实也就是弱化类型的定义VAR可代替任何类型编译器会根据上下文来判断你到底是想用什么类型的至于什么情
- 本文实例为大家分享了java实现省市区转换成树形结构的具体代码,供大家参考,具体内容如下前言:为什我想写这篇博客呢?第一方面是记录,另一方面
- 先来看看下面List<T>泛型集合的排序例子:using System;using System.Collections.Gen
- 前提在Windows下进行数据处理的时候最常见的情况莫过于读取Microsoft的Excel文件了,Excel的普及率惊人,是事实上的标准。
- Java中,将字节数组转成图片的有很多种方式,今天在这里记录其中一种,方便以后查询,也可以提供给没有接触的童鞋做一个参考。首先是将图片转成字
- 前言表之间的关系有几种:一对多、多对一、 一对一、多对多在多对一关系中,把多的部分拆成一个一个对象其实就是一对一关系,如账户和用户是多对一关
- 元注解是负责对其它注解进行说明的注解,自定义注解时可以使用元注解。Java 5 定义了 4 个注解,分别是 @Documented、@Tar
- java 避免出现NullPointerException(空指针)的方法总结Java应用中抛出的空指针异常是解决空指针的最好方式,也是写出
- 一、国际化准备资源文件,资源文件的命名格式如下:baseName_language_country.propertiesbaseName_l
- 一、概述ExpandableListView是常用的一个控件,今天自己做了个小练习,主要需求是单选以及多选的实现,看似比较简单,但是还是比较