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-permissionandroid:name="android.permission.CHANGE_CONFIGURATION"></uses-permission>
API中说该权限允许我们改变配置信息,但是我们在改变屏幕方向的程序中却并没有用到该权限,是不是相互冲突了呢?
这里我们可以这样认为,当我们声明该权限的的时候,
系统允许我们通过重写activity中的onConfigurationChanged方法来捕获和修改某些配置信息。
3.在Java源代码文件中重写Activity中的onConfigurationChanged方法:
importandroid.content.res.Configuration;
//框架回调函数onConfigurationChanged出自android.content.res.Configuration包。
//参数newConfig-新设备的配备。
//当设备配置信息有改动(比如屏幕方向的改变,实体键盘的推开或合上等)时,
//并且如果此时有Activity正在运行,系统会调用这个函数。
//注意:onConfigurationChanged只会响应应用程序在AnroidMainifest.xml中
// 通过android:configChanges="配置类型"指定的配置类型的改动;
// 而对于其他配置的更改,则系统会先销毁当前屏幕的Activity,
// 然后重新开启一个新的适应屏幕改变的Activity实例。
publicvoid
onConfigurationChanged(ConfigurationnewConfig)
{
//一定要先调用父类的同名函数,让框架默认函数先处理
//下面这句一定不能省去,否则将引发:android.app.SuperNotCalledException异常。
super.onConfigurationChanged(newConfig);
//检测屏幕的方向:纵向或横向
if(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_LANDSCAPE)
{
//当前为横屏,在此处添加额外的处理代码
}
elseif(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_PORTRAIT)
{
//当前为竖屏,在此处添加额外的处理代码
}
//检测实体键盘的状态:推出或者合上
if(newConfig.hardKeyboardHidden==Configuration.HARDKEYBOARDHIDDEN_NO)
{
//实体键盘处于推出状态,在此处添加额外的处理代码
}
elseif(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中适配器的作用,适配器模式 在Android中的简单理解「建议收藏」
- android加载dex方法,android Dex文件的加载
- android 安装p12证书,如何在Android中使用p12证书(客户端证书)
- android vlc 中文字幕,解决Android版vlc中文乱码问题
- 如何让Android平台像IPC一样实现GB28181前端设备接入
- Android 查看Android版本的方法
- android toast全屏,Android Toast实现全屏显示
- Unity+Android GET和POST方式的简单实现API请求(人像动漫化)
- Android preference_android studio preview
- android进程间通信的方式_Android进程注入
- 【Android 插件化】“ 插桩式 “ 插件化框架 ( 原理与实现思路 )
- 【Android UI】贝塞尔曲线 ④ ( 使用 android.graphics.Path 提供的 cubicTo 方法绘制三阶贝塞尔曲线示例 )
- 【Android Gradle 插件】Android 依赖管理 ⑥ ( 依赖冲突处理 | transitive 依赖传递设置 | exclude 依赖排除设置 | force 强制指定依赖库 )
- android galley实现画廊效果详解手机开发
- Android实现TextView文字水平滚动效果实现详解编程语言
- Android动画之3D翻转效果实现函数分析
- Android开机自启动服务的实现方法
- Android通过onDraw实现在View中绘图操作的示例
- Android调用系统的发邮件功能的小例子
- Android创建文件实现对文件监听示例
- android实现程序自动升级到安装示例分享(下载android程序安装包)
- android基础教程之夜间模式实现示例
- android实现widget时钟示例分享
- 安装时加入外部数据库示例(android外部数据库)
- Android实现图片浏览器示例
- Android实现退出时关闭所有Activity的方法