轉移自 LogDown 原文日期 September 16, 2014 22:06
不知道有沒有人和筆者一樣已經習慣在 Androidmanifest.xml 裡為 android:configChanges 加上一大串的 flag ,而忘記它的意義。
Activity 是很敏感的,如果沒有在 android:configChanges 裡給予任何值,那麼它很容易因為一些變化 destory ,然後 onCreate ,比如說:切換屏幕方向、改變語系;相反的,如果變化 包含於 你賦予的值,將會改呼叫 Activity 裡的 onConfigurationChanged 。
請注意,這裡說的是 包含於 ,也就是說一旦超出這個範圍,它就會 destory ,然後 onCreate 。
會在此強調,自然就是因為筆者曾經掉進這個坑。
有經驗的 Android 開發者都會對下面這行眼熟。
AndroidManifest.xml <activity ...... android:configChanges="orientation|keyboardHidden|screenSize" />
沒錯,切換屏幕方向時, Android 會改變的不只是 orientation ,還有 keyboardHidden 。
至於 screenSize ,則是 SDK 13 新增加的。
如果只有上面,網路上早有範例,筆者是不會特別提出來的,會特別寫這篇文章,是因為筆者最近在開發「切換 APP 語系(系統語系保持不變)」;這個項目並不是很少見,所以能夠參考一些前輩的經驗,但不幸的是,套用上去卻造成不停 destroy 的窘境。
在經過一番折騰之後,筆者終於想到問題可能肇因於新的 SDK ,於是改成了下面這個樣子。
AndroidManifest.xml <activity ...... android:configChanges="orientation|keyboardHidden|screenSize|locale|layoutDirection" />
在之前的舊版本,只需要 locale 而已; layoutDirection 是 SDK 17 新增加的部分,語系的變換會影響到閱讀方向( LTR, RTL )。想知道更詳細的,直接到
官方網頁吧。
雖然說 Android 官方的確是越來越細心了,但是這樣一來, SDK 每更新一版,開發者們都得特別留意,是不是又有新屬性了⋯⋯。