转自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上都表现为不重新创建