android实现在横竖屏切换时页面信息不被重置的示例分享

当屏幕转动切换的时候 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

(0)

相关推荐

  • Android横竖屏幕切换小结

    Android手机或平板都会存在横竖屏切换的功能,通常是由物理重力感应触发的,但是有时候也不尽然,通常在设置里面我们可以对手机的横竖屏切换进行关闭. AndroidManifest.xml <activity android:name="com.google.android.gms.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|

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

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

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

    前言 在开发中常要处理横竖屏切换,怎么处理先看生命周期 申明 Activity 横竖屏切换时需要回调两个函数 ,所以在此将这个两个函数暂时看成是Activity 横竖屏切换的生命周期的一部分,这两个函数如下 onSaveInstanceState(Bundle outState) :Activity 即将销毁时保存数据 onRestoreInstanceState(Bundle savedInstanceState) : Activity 重建或者恢复时候取出数据 横竖屏切换生命周期 1.启动程

  • android横竖屏切换不重启activity解决方案

    部分网友会发现Activity在切换到后台或布局从横屏LANDSCAPE切换到PORTRAIT,会重新切换Activity会触发一次onCreate方法,我们可以在androidmanifest.xml中的activit元素加入这个属性Android:configChanges="orientation|keyboardHidden" 即可,比如 <activity android:name=".android123" android:configChange

  • Android横竖屏幕切换生命周期详解

    一.简介 二.代码 /activityLifeCycle_3Screen/AndroidManifest.xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.fry.activityLifeCycle_3Screen" android:versionCode="1" android:versionName="1.

  • android横竖屏切换时候Activity的生命周期

    1.新建一个Activity,并把各个生命周期打印出来 2.运行Activity,得到如下信息 onCreate--> onStart--> onResume--> 3.按crtl+f12切换成横屏时 onSaveInstanceState--> onPause--> onStop--> onDestroy--> onCreate--> onStart--> onRestoreInstanceState--> onResume--> 4.再

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

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

  • 解析Android横竖屏切换的问题

    在做android 开发时,在默认情况下当屏幕从竖评变到横屏时会触发 onConfigurationChanged 事件 在默认情况下会重新加载画面并显示和横评一样的画面,这样会有2个问题,布局问题,在竖屏 显示的布局到横屏中由于宽和高发生了变化所有多少都会影响到布局(除非你定制2套画面在然后加个判断在横屏时怎么显示,在竖屏时怎么显示),当然最简单的办法就是在项目的 AndroidManifest.xml中找到你所指定的activity 中加上 只竖屏显示的话(android:screenOri

  • Android横竖屏切换实例总结

    本文实例总结了Android横竖屏切换相关技巧.分享给大家供大家参考,具体如下: 一.禁止横竖屏切换 Android横竖屏切换在手机开发中比较常见,很多软件在开发过程中为了避免横竖屏切换时引发不必要的麻烦,通常禁止掉横竖屏的切换,即通过在AndroidManifest.xml中设置activity中的android:screenOrientation属性值来实现. 该android:screenOrientation属性,他有以下几个参数: "unspecified":默认值 由系统来

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

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

随机推荐