2021年4月5日 星期一

【Android】onConfigurationChanged的觸發(和Configuration)

有些情況下-主要是指「配置」發生改變-,Activity會被重啟...

這些重啟發生時,經常伴隨「onConfigurationChanged的觸發」。(但官方文件說法是「不會觸發」。)

但如果只希望「onConfigurationChanged的觸發」發生、但不要有Activity重啟時,可以在AndroidManifest中,找到會被重啟的Activity下增加一個屬性「android:configChanges」,並在後面增加對應的參數來決定哪些情況要觸發、哪些情況就任由Activity重啟吧!


Configuration在官方的定義是指「決定系統要取用哪些Resource檔的方式」,像「螢幕是橫式或直式時會取用不同的Layout檔(如果有設定)」。

所以偵測螢幕橫式直式最正確的方式(除了等待onConfigurationChanged觸發)是從Activity下呼叫「getResource().getConfiguration()」去取得Configuration,然後判斷orientation的參數。


這個屬性後面可以接收的參數有:(官方網頁將它列在「activity」的Manifest說明中。)

android:configChanges=["mcc", "mnc", "locale",
                                 
"touchscreen", "keyboard", "keyboardHidden",
                                 
"navigation", "screenLayout", "fontScale",
                                 
"uiMode", "orientation", "density",
                                 
"screenSize", "smallestScreenSize"]

(官網這裡的說明有點奇妙,XML檔無法用這種方式輸入tag的參數,必須要用類似「"mcc|mnc"」這樣的格式才可以。其他欄位的說明有遵照這個模式,唯獨「configChanges」卻是錯誤的。)

比較奇妙的是:如果要針對螢幕轉向做偵測,需要使用多個參數會比較保險。

一般來說,是使用「orientation」和「screenSize」,(甚至再加上「uiMode」。)