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

 更新时间:2014年02月20日 11:52:01   作者:  
这篇文章主要介绍了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

相关文章

  • Android Studio项目适配AndroidX(Android 9.0)的方法步骤

    Android Studio项目适配AndroidX(Android 9.0)的方法步骤

    这篇文章主要介绍了Android Studio项目适配AndroidX(Android 9.0)的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • Android获取短信验证码的实现方法

    Android获取短信验证码的实现方法

    为了保护用户信息的安全性,开始使用通过服务器向用户发送验证码的方式,接下来通过本文给大家介绍android获取短信验证码的实现方法,非常不错,感兴趣的朋友一起看看吧
    2016-09-09
  • Android结合kotlin使用coroutine的方法实例

    Android结合kotlin使用coroutine的方法实例

    这篇文章主要给大家介绍了关于Android结合kotlin使用coroutine的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Android Compose实现联系人列表流程

    Android Compose实现联系人列表流程

    声明式UI,更简单的自定义,实时带交互的预览功能Compose并不是类似于Recyclerview的高级控件,而是直接抛弃了View,ViewGroup那套东西,从上到下鲁了一套全新的框架,直白点说就是它的渲染机制,布局机制,触摸算法,以及UI具体写法全都是新的
    2023-03-03
  • 九宫图比较常用的多控件布局(GridView)使用介绍

    九宫图比较常用的多控件布局(GridView)使用介绍

    GridView跟ListView都是比较常用的多控件布局,而GridView更是实现九宫图的首选,下面与大家分享下GridView用法,感兴趣的朋友可以参考下哈
    2013-06-06
  • Android Notification使用教程详解

    Android Notification使用教程详解

    这篇文章主要介绍了Android Notification使用,通知的使用的内容还是比较多的,此篇文章将会尽可能详细的介绍Notification的内容,需要的朋友可以参考下
    2022-07-07
  • android电话模拟器(示例代码)

    android电话模拟器(示例代码)

    本篇文章我将为大家介绍一下android电话模拟器(示例代码),需要的朋友可以过来参考下,希望对大家有所帮助
    2013-11-11
  • Android中使用Service实现后台发送邮件功能实例

    Android中使用Service实现后台发送邮件功能实例

    这篇文章主要介绍了Android中使用Service实现后台发送邮件功能的方法,结合实例形式分析了Service实现邮件的发送、接收及权限控制相关技巧,需要的朋友可以参考下
    2016-01-01
  • Android Studio配置国内镜像源(利用hosts)

    Android Studio配置国内镜像源(利用hosts)

    这篇文章主要介绍了Android Studio配置国内镜像源(利用hosts),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Android图片压缩几种方式总结

    Android图片压缩几种方式总结

    这篇文章主要介绍了Android图片压缩几种方式总结的相关资料,需要的朋友可以参考下
    2017-06-06

最新评论