Android設定橫屏後鎖屏問題
最近專案中,用到了橫屏。並且通過Fragment做了Tab頁效果。做UI的過程中UI展現沒有發現問題,但是今天上午,偶爾卻發現,當手機鎖屏時,我的Fragment會銷燬掉,Activity也會銷燬掉,並且Fragment和Activity會重啟。這個之前印象中,鎖屏只會onPause相違背。解決了一上午沒解決掉。坑娘啊~
首先,橫屏設定, 簡單在manifest檔案中通過activity標籤的 android:screenOrientation="landscape"設定。
再來看看出現的問題,在LogCat中列印的資訊。
1.第一次app啟動到資料獲取完畢,螢幕焦點獲取,可以看到Activity和Fragment的生命週期方法都正常。
2.問題來了,如果這個時候,按手機上的電源鍵,讓手機鎖屏,打印出來的生命週期方法很恐怖
可以看出,不是在onPause之後就停止了,而是銷燬,又重新建立了兩次Fragment和Activity。這個我就接受不了了,研究了一上午android手機鎖屏到底幹了些什麼東東。根骨太淺,木有研究明白。
3. 更恐怖的來了,當我們重新開啟之後,生命週期方法如下
Activity和Fragment再重新獲取焦點的時候,發現真個應用中多了好幾個Fragment的物件。這是為什麼呢???????
首先上解決辦法:
在manifest檔案中,設定Activity屬性 android:configChanges="orientation|screenSize|keyboardHidden",當發生這些配置改變時不會重新onCreate。注意得有screenSize
解決之後生命週期方法呼叫詳情:
1.第一次啟動獲取焦點
2.鎖屏
3.開屏
順眼多了~~
原因呢?從網上發現瞭如下資料:
==Android 2.3以前的橫豎屏切換==
在Android 2.3平臺上,我們可以需要設定介面的橫豎屏顯示時,可以在AndroidManifest.xml中,對Activity的屬性新增以下程式碼:
android:configChanges="orientation"
同時在Activity中覆寫onConfigurationChanged方法
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.i("TAG","I'm Android 2.3");
}
通過設定,當前Activity在橫豎屏切換的時候,便不會重新走Activity的生命週期,而是直接執行onConfigurationChanged()方法裡的內容。
==Android 4.0以後的橫豎屏切換==
當我們在Android 4.0上像之前那樣設定橫豎屏時,會發現竟然沒有效果,Activity依然走自己的生命週期,這是因為在API level 13以後Android做了修改了,SDK描述如下:
Caution: Beginning with Android 3.2 (API level 13), the "screen size" also changes when the device switches between portrait and landscape orientation. Thus, if you want to prevent runtime restarts due to orientation change when developing for API level 13 or higher (as declared by the minSdkVersion and targetSdkVersion attributes), you must include the "screenSize" value in addition to the "orientation" value. That is, you must decalare android:configChanges="orientation|screenSize". However, if your application targets API level 12 or lower, then your activity always handles this configuration change itself (this configuration change does not restart your activity, even when running on an Android 3.2 or higher device).
也就是說在Android 3.2(API level 13)以後,當裝置橫豎屏切換時螢幕尺寸也改變了。因此,如果你想在API Level 13或者更高的環境下,像以前那樣阻止裝置的橫豎屏切換,你需要在orientation後加上screenSize。也就說你要像這樣宣告:android:configChanges="orientation|screenSize"。
也就是說我們現在要在AndroidManifest.xml中的Activity加入以下屬性:
android:configChanges="orientation|screenSize"
同時依然要在Activity中覆寫onConfigurationChanged方法
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.i("TAG","I'm Android 4.0");
}