zoukankan      html  css  js  c++  java
  • Android横竖屏切换生命周期

    转自xiaoQLu http://www.cnblogs.com/xiaoQLu/p/3324503.html

      开源帮助android获得了飞速的发展,开源也导致了数不清的碎片问题。android的前期系统就是一个半成品,不成熟的系统以及google的快速迭代开发,导致厂家完全跟不上google的步伐,你2.3的bug还没改完,4.0就出来了,4.0的bug还在处理,4.1出来了,最后的结果就是,手机厂家给每部手机一个系统版本,并且不能升级。最后苦逼的就是广大的程序猿们,你不得不考虑从2.1到4.3的所有版本,除非你想放弃那些用低版本手机的用户。

      以上只是吐槽,下面正式开始

      前段时间碰到一个问题,就是反编译了一个程序,按照里面的方法自己做了一个一样的出来,关键代码已经完全一样了,但是就是有个问题,达不到他的效果,就是横竖屏切换,activity不重新创建,我花了很长时间来想,这到底是哪里出了问题,最后你知道嘛,我发现了 android:targetSdkVersion 这个属性居然会影响到横竖屏切换的生命周期。

      大家都知道,如果想解决横竖屏切换时,activity不重新创建,需要在manifest中配置 android:configChanges="orientation|keyboardHidden"属性,当然在api>13的时候,你需要额外添加一个参数,就是 screenSize ,不添加这个,在api 13以上的手机是不会生效的。

      我只是很想知道为什么别人的应用程序只设置两个属性,android:configChanges="orientation|keyboardHidden" 就可以在高版本的手机中起效果,而不需要额外添加screenSize 这个属性,我花了2天时间来想这个问题,就在我准备放弃的时候,我突然再次看到他的targetSdkVersion和我的不一样(之前我看到过一次,没怎么在意),抱着试试看的心态,我再次开始了自己的测试,奇迹发生了,就是你如果把targetSdkVersion设置为12及以下,他在高版本的手机上也会达到横竖屏切换不创建activity的效果,或许是我看api不仔细,其实这点在英文api中已经有说明,只是网上的相关资料太少。

      最后再次总结下横竖屏切换时activity的生命周期,网上相关的总结有很多,google一下,都是一样的,其实我告诉你,他们的总结只有部分是正解的,其他的在现在的模拟器上是不对的,我不知道他们用的测试api是多少,不能说他们是错误,在他们那个年代,我相信他是正确的,因为google嘛,你懂的,一切皆有可能

      首先放出我的结论

      (1)设置 android:configChanges="orientation" 和不设置这个属性,这两个效果是一样的,activity都是重新创新

      (2)横屏切竖屏,以及竖屏切回横屏,这两个也是一样的(如下总结),不会出现网上说的横屏切回竖屏时,生命周期执行两遍的问题

        1)重新创建activity的生命周期

          a)2.3上:onSaveInstanceState->onPause->onStop->onCreate->onStart->onRestoreInstanceState->onResume

          b)4.0上(3.2我没测试,只测试了4.0的):onPause->onSaveInstanceState->onStop->onCreate->onStart->onRestoreInstanceState->onResume

        2)不重新创建activity,只会调用 onConfigurationChanged

      (3)targetSdkVersion会影响生命周期,targetSdkVersion在12及以下的话,设置了 android:configChanges="orientation|keyboardHidden" ,在机器上都不会重新创建activity,只会调用 onConfigurationChanged,如果设置targetSdkVersion>12的话,只在sdkVersion<=12的机器上有效果,>12的机器上activity还是会重新创建(需要加上screenSize才有效果)

      (4)android2.3和android4.0的生命周期不一样,2.3是先onSaveInstanceState,后onPause,4.0是先onPause,后onSaveInstanceState(这个我表示不想吐槽了)

      现在放出所有的测试结果(注:以下结果中的不重新创建activity和重新创建均代表结论2的内容)

    (1)设置 android:configChanges="orientation" 和不设置这个属性,生命周期表现为重新创建activity

    (2)设置 android:configChanges="orientation|keyboardHidden",在2.3上表现为不重新创建activity,4.0如下

      a)android:targetSdkVersion<="12",生命周期表现为不重新创建activity

      b)android:targetSdkVersion>"12",表现为重新创建activity

    (3)设置 android:configChanges="orientation|keyboardHidden|screenSize",在2.3和4.0上都表现为不重新创建

  • 相关阅读:
    【leetcode】1630. Arithmetic Subarrays
    【leetcode】1629. Slowest Key
    【leetcode】1624. Largest Substring Between Two Equal Characters
    【leetcode】1620. Coordinate With Maximum Network Quality
    【leetcode】1619. Mean of Array After Removing Some Elements
    【leetcode】1609. Even Odd Tree
    【leetcode】1608. Special Array With X Elements Greater Than or Equal X
    【leetcode】1603. Design Parking System
    【leetcode】1598. Crawler Log Folder
    Java基础加强总结(三)——代理(Proxy)Java实现Ip代理池
  • 原文地址:https://www.cnblogs.com/1995hxt/p/4908330.html
Copyright © 2011-2022 走看看