一.發(fā)現(xiàn)問題
問題:程序退出后臺慷嗜,修改系統(tǒng)字體大寫淀弹,恢復(fù)app到前臺,發(fā)現(xiàn)程序重走生命周期了庆械,尷尬了薇溃,發(fā)生一些了騷亂。我換了其他的方式測試缭乘,都不能復(fù)現(xiàn)沐序。只有修改系統(tǒng)字體的時候,發(fā)生了這個奇葩的問題堕绩。
那就問問度娘了策幼,感謝這個作者:https://blog.csdn.net/libo0878/article/details/52883769
內(nèi)容摘抄:
查閱了一些資料,發(fā)現(xiàn)在app中文字標(biāo)注的單位為sp奴紧。當(dāng)系統(tǒng)字體大小發(fā)生變化的時候sp的度量標(biāo)準(zhǔn)發(fā)生了變化特姐,這個時候,系統(tǒng)會給app發(fā)送一個通知绰寞,告訴它配置已經(jīng)變了到逊,需要重新刷新界面。類似的操作就像是橫豎屏切換滤钱,在onConfigurationChanged()方法里面進(jìn)行需要的操作的配置觉壶。
橫豎屏切換,app走的生命周期方法是onDestroy(),onCreate()件缸。一般我們的應(yīng)用通常配置是設(shè)定一個固定的方向讓它避免橫豎屏切換铜靶。通過配置configChanges屬性,防止界面的銷毀和重建。
android:screenOrientation="portrait"
android:configChanges="orientation|screenSize|keyboardHidden
回到問題本身争剿,發(fā)生問題的原理是這樣的:系統(tǒng)字體大小發(fā)生了變化已艰,它在app回到前臺的時候發(fā)送了一個通知告訴app。app此時走的生命周期的方法是
onDestroy()
onCreate()
onResume()
通過這樣的操作進(jìn)行UI界面的刷新蚕苇。
重點(diǎn)來了:此時app是作為一種異常走的onDestroy()方法哩掺,并不是正常的按返回鍵進(jìn)行的退出執(zhí)行的onDestroy()。這個時候系統(tǒng)會自動在onSaveInstanceState()方法里面臨時性的保存之前的界面狀態(tài)或者變量信息涩笤。方便在onCreate()的時候嚼吞,從bundle里面直接取出來使用。但是畢竟是異常的狀態(tài)蹬碧,有些實(shí)體的信息或者fragment堆棧的狀態(tài)恢復(fù)的時候就有可能錯亂舱禽,導(dǎo)致顯示效果出錯或者crash。
二.解決方法
android:configChanges="orientation|screenSize|keyboardHidden|fontScale
1.添加fontScale屬性恩沽,避免系統(tǒng)字體發(fā)生變化的時候誊稚,重新create界面。如果僅僅這樣處理罗心,app的在從后臺切換到前臺的時候里伯,字體會隨著系統(tǒng)的字體大小發(fā)生變化。
2.把a(bǔ)pp里面字體的單位协屡,由sp改為dp俏脊,這樣,app的字體展示就不會隨著系統(tǒng)的字體變化而發(fā)生變化肤晓。
可以根據(jù)產(chǎn)品的需要自行進(jìn)行配置。