源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2020-02-14 14:54 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:android实现在横竖屏切换时页面信息不被重置的示例分享
当屏幕转动切换的时候 Android 机制是: 销毁当前屏幕的 Activity ,然后重新开启一个新的适应屏幕改变的 Activity 。 那么,我们该如何在屏幕切换的时候页面信息不被重置呢? 解决实现: 1.在 AnroidMainifest.xml 的 activity 元素中加入:
[u]复制代码[/u] 代码如下:
android:configChanges="orientation|keyboardHidden"
[u]复制代码[/u] 代码如下:
android:configChanges="orientation|keyboard|keyboardHidden"
表示在改变屏幕方向、弹出软件盘和隐藏软键盘时,不再去执行 onCreate() 方法, 而是直接执行 onConfigurationChanged() 。 如果不申明此段代码,按照Activity的生命周期,都会去执行一次 onCreate() 方法, 而 onCreate() 方法通常会在显示之前做一些初始化工作。 所以如果改变屏幕方向这样的操作都去执行 onCreate() 方法,就有可能造成重复的初始化, 降低程序效率是必然的了,而且更有可能因为重复的初始化而导致数据的丢失。 这是需要避免的! 2.权限声明:
[u]复制代码[/u] 代码如下:
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"></uses-permission>
API 中说该权限允许我们改变配置信息,但是我们在改变屏幕方向的程序中却并没有用到该权限,是不是相互冲突了呢? 这里我们可以这样认为,当我们声明该权限的的时候, 系统允许我们通过重写 activity 中的 onConfigurationChanged 方法来捕获和修改某些配置信息。 3.在 Java 源代码文件中重写 Activity 中的 onConfigurationChanged 方法:
[u]复制代码[/u] 代码如下:
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 ,得到如下信息:
[u]复制代码[/u] 代码如下:
onCreate onStart onResume
第二步: 按 crtl + f12 切换成横屏时:
[u]复制代码[/u] 代码如下:
onSaveInstanceState onPause onStop onDestroy onCreate onStart onRestoreInstanceState onResume
第三步: 再按 crtl + f12 切换成竖屏时,发现打印了两次相同的信息:
[u]复制代码[/u] 代码如下:
onSaveInstanceState onPause onStop onDestroy onCreate onStart onRestoreInstanceState onResume onSaveInstanceState onPause onStop onDestroy onCreate onStart onRestoreInstanceState onResume
第四步: 修改 AndroidManifest.xml 文件中的 Activity 元素, 添加 android:configChanges="orientation" , 按 crtl + f12 切换成横屏时:(与上面无修改时相同)
[u]复制代码[/u] 代码如下:
onSaveInstanceState onPause onStop onDestroy onCreate onStart onRestoreInstanceState onResume
第五步: 再按 crtl + f12 切换成竖屏时, 发现不会再打印相同信息, 但多打印了一行 onConfigChanged :
[u]复制代码[/u] 代码如下:
onSaveInstanceState onPause onStop onDestroy onCreate onStart onRestoreInstanceState onResume onConfigurationChanged
第六步: 修改 AndroidManifest.xml 文件中的 Activity 元素, 把
[u]复制代码[/u] 代码如下:
android:configChanges="orientation"
改成
[u]复制代码[/u] 代码如下:
android:configChanges="orientation|keyboardHidden"
按 crtl + f12 切换成横屏时, 就只打印 onConfigChanged :
[u]复制代码[/u] 代码如下:
onConfigurationChanged
第七步: 按 crtl + f12 切换成竖屏时:
[u]复制代码[/u] 代码如下:
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 键(跟被完全覆盖是一样的):
[u]复制代码[/u] 代码如下:
onSaveInstanceState --> onPause --> onStop onRestart --> onStart --> onResume
3.Activity 未被完全覆盖只是失去焦点:
[u]复制代码[/u] 代码如下:
onPause --> onResume
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部