当前位置: 移动技术网 > IT编程>移动开发>Android > android实现在横竖屏切换时页面信息不被重置的示例分享

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

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

厚街技校,中国化工设备网,深水鳗鱼

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

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

相关文章:

验证码:
移动技术网