你還在問android橫豎屏切換的生命週期?

muzhi121發表於2013-09-16

  本文原創,轉載請註明來自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上都表現為不重新建立

 

歡迎大家交流,有問題請指正。

 

 

 

 

  

  

 

相關文章