Configuration有哪些屬性
- Manifest指:在Manifest文件中,activity標(biāo)簽的configChanges是否可以使用
- Java指:android.content.res.Configuration類中是否存在對(duì)應(yīng)的屬性
- 代表存在這個(gè)屬性臀蛛,N代表不存在這個(gè)屬性
屬性 | Manifest | Java | 作用 | 版本信息 |
---|---|---|---|---|
mcc | - | - | SIM卡相關(guān) | 1 |
mnc | - | - | SIM卡相關(guān) | 1 |
locale | - | - | 修改地區(qū) | 1 |
layoutdirection | - | N | 隨著locale變化 | 17 |
touchscreen | - | - | 一般不會(huì)發(fā)生 | 1 |
keyboard | - | - | 鍵盤類型變化(外接鍵盤) | 1 |
keyboardHidden | - | - | 鍵盤是否顯示的狀態(tài)變化 | 1 |
navigation | - | - | 導(dǎo)航按鈕的類型(滾動(dòng)球温鸽、方向鍵) | 1 |
navigationHidden | N | - | 導(dǎo)航按鈕是否顯示的狀態(tài)變化 | 1 |
screenLayout | - | - | 屏幕的大小懊缺,長寬比窝稿,布局方向,曲面屏 | 1 |
fontScale | - | - | 用戶修改字號(hào) | 1 |
uiMode | - | - | 車載模式占卧,底座模式甘苍,夜間模式 | 8 |
orientation | - | - | 屏幕方向 | 1 |
screenSize | - | - | 屏幕大小 screenWidthDp screenHeightDp |
13 |
smallestScreenSize | - | - | 屏幕物理尺寸大小 smallestScreenWidthDp |
13 |
densityDpi | N | - | 屏幕密度 | 1 |
Configuration和Resouce的關(guān)系
從Resouce獲取資源時(shí)尝蠕,默認(rèn)使用當(dāng)前Configuration相匹配的資源。但也可以在運(yùn)行時(shí)载庭,更新Resouce關(guān)聯(lián)的Configuration看彼。
// android.content.res.Resources
/**
* Store the newly updated configuration.
*/
public void updateConfiguration(Configuration config,
DisplayMetrics metrics) {
updateConfiguration(config, metrics, null);
}
/**
* @hide
*/
public void updateConfiguration(Configuration config,
DisplayMetrics metrics, CompatibilityInfo compat) {
synchronized (mAccessLock) {
[....]
mAssets.setConfiguration(mConfiguration.mcc, mConfiguration.mnc,
locale, mConfiguration.orientation,
mConfiguration.touchscreen,
mConfiguration.densityDpi, mConfiguration.keyboard,
keyboardHidden, mConfiguration.navigation, width, height,
mConfiguration.smallestScreenWidthDp,
mConfiguration.screenWidthDp, mConfiguration.screenHeightDp,
mConfiguration.screenLayout, mConfiguration.uiMode,
Build.VERSION.RESOURCES_SDK_INT);
[....]
}
[....]
}
從這部分代碼可以看到,所有資源文件夾的后綴中囚聚,除了v19之類的后綴是和Android系統(tǒng)版本相關(guān)靖榕,其他的都是和Configuration相關(guān)。
因此需要在代碼運(yùn)行時(shí)修改應(yīng)用的語言或屏幕密度顽铸,都可通過Resources#updateConfiguration
來實(shí)現(xiàn)茁计。但一定要在更新配置之后,重新啟動(dòng)應(yīng)用谓松,從而確保所有頁面的資源都被重新獲取星压。
Configuration的修改怎么影響Activity的聲明周期
上節(jié)中通過更新Resouce關(guān)聯(lián)的Configuration控制顯示樣式的方案,并沒有真正修改系統(tǒng)的配置鬼譬。
當(dāng)系統(tǒng)的配置在真正被改變的時(shí)候租幕,為了確保Activity能使用正確的資源,系統(tǒng)默認(rèn)會(huì)銷毀Activity并自動(dòng)重新啟動(dòng)拧簸。銷毀前,系統(tǒng)會(huì)調(diào)用Activity#onSaveInstanceState
男窟,重建時(shí)會(huì)在onCreate中傳入保存的狀態(tài)盆赤。
如果Activity希望自己處理某些設(shè)置的改變,則需要在Manifest中定義對(duì)應(yīng)的configChanges歉眷。這時(shí)Activity#onConfigurationChanged
會(huì)被調(diào)用牺六。
由于目前大部分應(yīng)用的單個(gè)頁面的屏幕方向不會(huì)發(fā)生改變,所以很少需要實(shí)現(xiàn)Activity#onConfigurationChanged
汗捡。
但為了避免橫屏頁面和豎屏頁面之間切換時(shí)淑际,Activity自動(dòng)重啟 畏纲,需要給activity配置android:configChanges="orientation|keyboardHidden|screenSize"
,其中screenSize是在SDK>=13時(shí)引入的春缕。
如果確實(shí)有頁面有橫豎兩種顯示模式盗胀,而且在橫豎屏?xí)r使用不同的資源。則需要在Activity#onConfigurationChanged
中針對(duì)有差別的資源進(jìn)行更新锄贼。