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上都表現爲不重新創建

 

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章