一般的我们去切换屏幕方向都是不希望Activity被重新创建,这时就需要对一些属性进行设置,或者使用代码设置。 
       今天想学一下Android屏幕横竖屏切换,但是网上很多知识不准确或不正确,这里我还是自己总结一篇文章,供大家参考。

一.屏幕横竖屏切换的代码

很多文章一上来就将什么生命周期或者乱七八糟的,我认为你首先要会横竖屏切换啊!

(一)设置屏幕横屏代码

  1. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

这个在Activity下可以直接使用

(二)设置屏幕竖屏的代码

  1. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

(三)判断屏幕是横屏还是竖屏的状态

  1. /**
  2. *系统中定义: int ORIENTATION_PORTRAIT = 1; 竖屏
  3. *系统中定义: int ORIENTATION_LANDSCAPE = 2; 横屏
  4. */
  5. //获取屏幕的方向 ,数值1表示竖屏,数值2表示横屏
  6. int screenNum = getResources().getConfiguration().orientation;

这里啰嗦一句: 
       PORTRAIT 翻译是肖像的意思,肖像一般都是竖直方向的吧 
       LANDSCAPE 翻译是景观的意思,景象一般是要横着看的吧,才能看得比较多 
这是我对系统定义横竖屏字面的理解。

二.横竖屏切换Activity生命周期回调

我今天测试了一下,发现很多文章描述这里并不正确! 
横竖屏属性设置可以在AndroidManifest.xml中设置 
代码:

  1. <activity android:name="MyActivity"
  2. android:configChanges="orientation|keyboardHidden|screenSize"
  3. android:screenOrientation="portrait"
  4. android:label="@string/app_name">

(一)configChanges属性

设置configChanges这个值就可以避免Activity生命周期被回调,下面是这个值的详细说明:

configChanges属性可以设置多个值,中间使用竖线分割; 
1. orientation 屏幕在纵向和横向间旋转 
2.keyboardHidden 键盘显示或隐藏 
3.screenSize 屏幕大小改变了 
4.fontScale 用户变更了首选的字体大小 
5.locale 用户选择了不同的语言设定 
6.keyboard 键盘类型变更,例如手机从12键盘切换到全键盘 
7.touchscreen或navigation 键盘或导航方式变化,一般不会发生这样的事件

其中前面三个是常用的,后面的属性很少用! 
如果要Activity中的生命周期不回调,就要设置:

  1. android:configChanges="orientation|keyboardHidden|screenSize"

注意一定要设置这三个值,否是生命周期会被回掉。 
这里我吐槽一下网上的文章,很多都是说设置了“orientation“和”keyboardHidden”属性就可以避免Activity生命周期的回调,其实不对。因为这是android很久以前版本的SDK才有效,我也是通过实验和看别人一些经验才知道的,很多文章没有提到这个“ScreenSize”属性,这也是近几年才出现的,但是也是要必须设置的,你不试过的话就不知道! 
       如果只设置”orientation|screenSize”,会发生竖屏变横屏生命周期会有先销毁后重新onCreate,如果是横屏变竖屏生命周期方法不会被回调!

(二)onConfigurationChanged方法

在Activity中可以重写这个方法:

  1. //屏幕方向发生改变的回调方法
  2. @Override
  3. public void onConfigurationChanged(Configuration newConfig) {
  4. if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
  5. text_screen.append("\n 当前屏幕为横屏");
  6. } else {
  7. text_screen.append("\n 当前屏幕为竖屏");
  8. }
  9. super.onConfigurationChanged(newConfig);
  10. Log.e("TAG", "onConfigurationChanged");
  11. // setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); //设置横屏
  12. }

前提是AndroidMainfest.xml中已经定义了:

之后onConfigurationChanged才能得到回调。

onConfigurationChanged方法是在xml文件中定义了属性后,并且视图显示后屏幕的方向发生改变,这个方法才会被回调。 
       在onConfigurationChanged可以拿到屏幕改变后的屏幕方向的值,确认屏幕的方向。很多操作也是可以在这个回调方法中执行。

(三)screenOrientation属性

这个属性相对来说就没那么多人使用了,但是也是有用的,它可以设置屏幕默认的方向,但是仅仅是默认显示,设置后还是可以在代码中改变屏幕的方向的!

screenOrientation有如下选项: 
1.unspecified 默认值,由系统判断状态自动切换 
2.landscape 横屏 
3. portrait 竖屏 
4.user 用户当前设置的orientation值 
5. behind 下一个要显示的Activity的orientation值 
6. sensor 使用传感器 传感器的方向 
7. nosensor 不使用传感器 基本等同于unspecified

screenOrientation只能选择一个值!一般设置都是横屏或竖屏,其他也是很少使用的。 
       上面也说了这里只是设置的一个默认值,屏幕的方向是可以通过代码被改变。 
       如果你想一直保持横屏或竖屏,可以在onConfigurationChanged方法后设置屏幕的方向。

(三)生命周期的知识

系统不同会导致切屏出现不同的反应,查看网上资料发现,好像手机品牌不同也会出现不同的反应。

  1. 横竖屏切换
  2.  
  3. 切换到横屏,然后切换到竖屏,销毁了两次
  4. onSaveInstanceState
  5. onPause
  6. onStop
  7. onDestroy
  8. onCreate
  9. onStart
  10. onRestoreInstanceState
  11. onResume
  12. onSaveInstanceState
  13. onPause
  14. onStop
  15. onDestroy
  16. onCreate
  17. onStart
  18. onRestoreInstanceState
  19. onResume
  20.  
  21. 修改AndroidManifest.xml,把该Activity添加 android:configChanges="orientation",切横屏,再切回竖屏,发现不会再打印相同信息,只销毁一次,但多打印了一行onConfigChanged
  22.  
  23. onSaveInstanceState
  24. onPause
  25. onStop
  26. onDestroy
  27. onCreate
  28. onStart
  29. onRestoreInstanceState
  30. onResume
  31. onConfigurationChanged
  32.  
  33. 更改android:configChanges="orientation|keyboardHidden",切横屏,再切回竖屏,就只打印onConfigChanged
  34. onConfigurationChanged
  35. onConfigurationChanged

(四)Activity的生命周期

当复习一下: 
onCreate、onStart、onResume、onPause、onStop、onDestory、onRestart,一共七个生命周期的方法

Android屏幕横竖屏切换和生命周期管理的详细总结的更多相关文章

  1. [android] activity横竖屏切换的生命周期

    模拟器横竖屏切换,ctrl+f11 界面activity会销毁,重新打开创建 第一种做法: 定死就是横屏 在清单文件,<activity/>节点部分,添加属性,设置屏幕朝向 android ...

  2. 无废话Android之activity的生命周期、activity的启动模式、activity横竖屏切换的生命周期、开启新的activity获取他的返回值、利用广播实现ip拨号、短信接收广播、短信监听器(6)

    1.activity的生命周期 这七个方法定义了Activity的完整生命周期.实现这些方法可以帮助我们监视其中的三个嵌套生命周期循环: (1)Activity的完整生命周期 自第一次调用onCrea ...

  3. 你还在问android横竖屏切换的生命周期?

    本文原创,转载请注明来自xiaoQLuhttp://www.cnblogs.com/xiaoQLu/p/3324503.html 开源帮助android获得了飞速的发展,开源也导致了数不清的碎片问题. ...

  4. Android横竖屏切换的生命周期

    1.新建一个Activity,并把各个生命周期打印出来 2.运行Activity,得到如下信息 onCreate--> onStart--> onResume--> 3.按crtl+ ...

  5. Android Activity横竖屏转换的生命周期

    新创建一个Activity,用来此次测试. 先贴代码 package com.hugo.apj.activitylifetest; import android.support.v7.app.AppC ...

  6. Android 中Activity生命周期分析:Android中横竖屏切换时的生命周期过程

    最近在面试Android,今天出了一个这样的题目,即如题: 我当时以为生命周期是这样的: onCreate --> onStart -- ---> onResume ---> onP ...

  7. 解决Android手机 屏幕横竖屏切换

    Android中当屏幕横竖屏切换时,Activity的生命周期是重新加载(说明当前的Activity给销毁了,但又重新执行加载),怎么使屏幕横竖屏切换时,当前的Activity不销毁呢? 1. 在An ...

  8. android:configChanges 屏幕横竖屏切换

    出处:http://blog.csdn.net/djy1992/article/details/9378195 --->  android:screenOrientation="por ...

  9. Android的横竖屏切换

    android的横竖屏切换,也会发生不少问题. 1. 锁定屏幕方向,禁止切换: 在AndroidManifest.xml中的Activity参数中加上   android:screenOrientat ...

随机推荐

  1. java之JVM学习--简单理解编译和运行的过程之概览

    java代码编译流程图: java字节码执行由JVM执行引擎完成 Java代码编译和执行的整个过程包含了以下三个重要的机制: Java源码编译机制 类加载机制 类执行机制 Java源码编译机制 Jav ...

  2. 学java编程软件开发,非计算机专业是否能学

    近几年互联网的发展越来越好,在国外,java程序员已经成为高薪以及稳定职业的代表,虽然国内的有些程序员很苦逼,但是那只是少数,按照国外的大方向来看,程序员还是一个很吃香的职业.根据编程语言的流行程度, ...

  3. Oracle笔记(十) 约束

    表虽然建立完成了,但是表中的数据是否合法并不能有所检查,而如果要想针对于表中的数据做一些过滤的话,则可以通过约束完成,约束的主要功能是保证表中的数据合法性,按照约束的分类,一共有五种约束:非空约束.唯 ...

  4. git 账号密码

    由于git迁移服务地址,而导致无法登陆 首先  git config --system --unset credential.helper  然后执行 git config --global cred ...

  5. 牛客小白月赛19 E 「火」烈火燎原 (思维,树)

    牛客小白月赛19 E 「火」烈火燎原 (思维,树) 链接:https://ac.nowcoder.com/acm/contest/2272/E来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空 ...

  6. ClassLoader源码分析与实例剖析

    在之前已经对类加载器做了不少实验了,这次主要是来分析一下ClassLoader的源码,当然主要是先从理解官方给它的注释开始,为之后自定义类加载器打好坚石的基础,下面开始: 而从类的层次结构来看也能感受 ...

  7. Java笔记(基础第四篇)

    Java集合类 集合类概述 Java 语言的java.util包中提供了一些集合类,这些集合类又被称为容器.常用的集合有List集合.Set集合.Map集合,其中List与Set实现了Collecti ...

  8. vue的prop父子组件传值

    props down, events up 父组件通过 props 向下传递数据给子组件:子组件通过 events 给父组件发送消息. 静态 props 要让子组件使用父组件的数据,需要通过子组件的 ...

  9. [].slice.call(arguments,1) 个人理解

    var arr = []; [] == arr; 假设 var arr = [1,2,3,4,5]; 那么 arr.slice(1,2) == [2]; 通过 slice.call 才能使用call显 ...

  10. mysql 主从复制不一致,不停库不锁表恢复主从同步

    注意: 进行此操作时,确认在之前已经开启了MySQL的bin-log日志,如果没有则无法实现 为了安全考虑,我们授权一个用户进行数据备份: [root@7con ] mysql -uroot -p m ...