Android Activity 横竖屏切换的生命周期
作者:易术军 发布时间:2021-08-12 23:48:23
前言
在开发中常要处理横竖屏切换,怎么处理先看生命周期
申明
Activity 横竖屏切换时需要回调两个函数 ,所以在此将这个两个函数暂时看成是Activity 横竖屏切换的生命周期的一部分,这两个函数如下
onSaveInstanceState(Bundle outState) :Activity 即将销毁时保存数据
onRestoreInstanceState(Bundle savedInstanceState) : Activity 重建或者恢复时候取出数据
横竖屏切换生命周期
1、启动程序进入Activity界面
2、旋转屏幕
3、再次旋转屏幕
4 在AndroidManifest.xml中设置
android:configChanges="orientation|screenSize",切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
注意:
MiniSdkVersion大于等于 13 时候:android:configChanges="orientation" 或者 android:configChanges="orientation|keyboardHidden" 重新调用各个生命周期
MiniSdkVersion小于 13 时候:
(1)不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
(2)设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
(3)设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
5、屏幕切换避免,重走Activity生命周期
从上面屏幕切换生命周期可以看出每次切换都在重新创建,为了不必要的麻烦比如视频播放屏幕旋转等,避免重走生命周期就是一个比较好的解决方案
(1)android 2.3之前的版本 android:configChanges="orientation|keyboardHidden"
(2)android 3.0之后的版本 android:configChanges="orientation|screenSize"
横竖屏设置
Android横竖屏切换在手机开发中比较常见,很多软件在开发过程中为了避免横竖屏切换时引发不必要的麻烦,通常禁止掉横竖屏的切换。
一、在AndroidManifest.xml中设置activity中的android:screenOrientation属性值来实现。
(1)竖屏:android:screenOrientation="portrait"
(2)横屏:android:screenOrientation="landscape"
二、在Java代码中通过类似如下代码来设置 (不推荐这种方法,在大的app不同方向启动时会慢)
(1)竖屏: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
(2)横屏:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
三、如果要彻底禁止翻转,忽略重力感应带来的切换,(模拟器上不管用,在真机上是正确的)
(1)忽略重力:android:screenOrientation="nosensor"
横竖屏辨识
一、在onConfigurationChanged里判断,为了onConfigurationChanged在监听屏幕方向变化有效需要以下条件
(1)AndroidManifest.xml增加权限:<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"></uses-permission>
(2)AndroidManifest.xml里设置的MiniSdkVersion和 TargetSdkVersion属性大于等于13
(3)在AndroidManifest.xml的Activity里增加:android:configChanges="keyboard|screenSize|orientation|layoutDirection"
(4)在onConfigurationChanged(Configuration newConfig)进行判断
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if(newConfig.orientation == 1)//竖屏
if(newConfig.orientation == 2)// 横屏
}
二、因为当屏幕变为横屏的时候,系统会重调用Activity的onCreate方法可以在onCreate中来检查当前的方向,然后可以让你的setContentView来载入不同的layout xml。
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
Log.i("info","landscape"); // 横屏
} else if(this.getResources().getConfiguration().orientation ==Configuration.ORIENTATION_PORTRAIT) {
Log.i("info","portrait"); // 竖屏
}
注意:该方法是在AndroidManifest.xml中不设置onConfigurationChanged才能重走生命周期
横竖屏切换布局文件设置
如果要让软件在横竖屏之间切换,由于横竖屏的高宽会发生转换,有可能会要求不同的布局。可以通过以下方法来切换布局
(1)在res目录下建立layout-land和layout-port目录,相应的layout文件名称不变,比如main.xml。layout-land是横屏的layout,layout-port是竖屏的layout,其他的不用管,模拟器会自动寻找。
(2)在上面横竖屏辨识中,如果横竖屏出现变化,在onCreate()或者onConfigurationChanged()判断方向,就可以在相应的方法中重新setContentView来载入不同的layout xml布局文件
横竖屏切换数据保存与读取
另外,android中每次屏幕的切换动会重启Activity,所以应该在Activity销毁前保存当前活动的状态,在Activity再次Create的时候载入配置,那样,进行中的游戏就不会自动重启了!
Activity 数据保存
(1)如果因为系统资源紧张而导致Activity的Destory或者旋转屏幕时被destroyed与Recreated, 系统会在用户回到这个Activity时有这个Activity存在过的记录,系统会使用那些保存的记录数据(instance state)它是一些存放在Bundle对象中的key-value pairs,系统默认使用 Bundle保存信息
(2)为了可以保存额外更多的数据到instance state,要重写写这个回调函数onSaveInstanceState(Bundle outState),系统会在Activity被异常Destory时传递Bundle对象,这样我们就可以增加额外的信息到Bundle中并保存到系统中。若系统在Activity被Destory之后想重新创建这个Activity实例时,之前的Bundle对象会(系统)被传递到你我们activity的
(3)Activity开始stop,系统会调用 onSaveInstanceState(Bundle outState) ,Activity可以用键值对的集合来保存状态信息。这个方法会默认保存Activity视图的状态信息,如在 EditText组件中的文本或 ListView 的滑动位置
Activity 数据恢复
(1)当Activity从Destory中重建,我们可以从系统传递的Activity的Bundle中恢复保存的状态。 onCreate() 与 onRestoreInstanceState() 回调方法都接收到了同样的Bundle,里面包含了同样的实例状态信息。
(2)由于 onCreate() 方法会在第一次创建新的Activity实例与重新创建之前被Destory的实例时都被调用,我们必须在尝试读取 Bundle 对象前检测它是否为null。如果它为null,系统则是创建一个新的Activity实例,而不是恢复之前被Destory的Activity。
(3)也可以选择实现 onRestoreInstanceState() ,而不是在onCreate方法里面恢复数据。 onRestoreInstanceState()方法会在 onStart() 方法之后执行. 系统仅仅会在存在需要恢复的状态信息时才会调用 onRestoreInstanceState() ,因此不需要检查 Bundle 是否为null。
以上所述是小编给大家介绍的Android Activity 横竖屏切换的生命周期的相关知识,希望对大家有所帮助!


猜你喜欢
- 常用依赖 //1.直接依赖第三方开源库,一般是托管在 jitpack 或者 jcenter implementation 'com.
- Java定义Long数据类型Long lg=10L;只需要在定义的的整型后面加个L;就和定义float数据类型一样Float ft=5.20
- 什么是Java泛型Java 泛型(generics)是 Jdk 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制, 该机制允许程序
- 本文实例讲述了C#获取进程或线程相关信息的方法。分享给大家供大家参考。具体实现方法如下:using System;using System.
- 如果使用了反向代理软件,将http://192.168.1.110:2046/ 的URL反向代理为http://www.xxx.com/ 的
- 1. 启动入口本系列RocketMQ4.8注释github地址,希望对大家有所帮助,要是觉得可以的话麻烦给点一下Star哈前面我们已经分析完
- 问题的起源在项目里,有时候需要实现一个图片轮播的效果,用来展示Banner。同时,图片能循环播放,下面还有一排小圆点来指示当前轮播到哪一页了
- ClasspathResource路径问题前言在项目中工程以springboot jar形式发布,跟之前容器比少了一个解压目录,这个过程中出
- 本文实例为大家分享了使用C#写出一个简单的记事本程序,供大家参考,具体内容如下编程语言: C# 编程环境: Visual Studio 20
- Android 中View.onDraw(Canvas canvas)的使用方法View通过View.onDraw(Canvas canva
- 本文实例介绍了清除aspx页面缓存的程序实现方法,具体步骤如下:所有用到页面缓存的aspx页面修改以下cs,让它继承一个自定义基类(例如:P
- 一开始我就纳闷了,怎么调试都只是一个光溜溜的界面,右侧的工具栏都没有如图:就一个光秃秃的界面,什么都没有,这就对调试很不方便于是我就试了试各
- 前言对于信息的加密方式多种多样,之前为大家介绍了一种自己设计的加密方式,有兴趣的朋友可以欣赏一下,欢迎给予指点。今天为大家介绍一下对称加密方
- 本文主要介绍了C# WinForm状态栏实时显示当前时间(窗体状态栏StatusStrip示例),分享给大家,具体如下:实现效果:通过Sta
- 针对实例化过程中会做什么的分析,其中主要的是怎么推断出构造方法,怎么进行匹配【1】前言实例化这一步便是在doCreateBean方法的 in
- 简介这篇文章我一直在纠结到底要不要写,不想写一来因为定时器用法比较简单,二来是面试中也不常问。后来还是决定写了主要是想把自己分析问题思路分享
- 本文采用C#实例讲解了处理图片为浮雕效果的实现方法,这在PS中是一个常见的功能,也是C#中的一个简单的图像处理例子。程序先读取原图,然后依次
- Android中可以创建三种对话框、确定取消对话框、单选对话框、多选对话框android中的确定取消对话框演示示例Android中使用单选对
- 最近工作遇到一个需求,需要下载excel模板,编辑后上传解析存储到数据库。因此为了更好的理解公司框架,我就自己先用spring mvc实现了
- 为什么要有线程池?在实际使用中,服务器在创建和销毁线程上花费的时间和消耗的系统资源都相当大,所以要尽可能减少创建和销毁线程的次数。由于没有线