問題:最近公司測試同學,在無意間調整系統字體大小的之后把app從后臺切換到前臺,發(fā)現app crash。
查閱了一些資料模暗,發(fā)現在app中文字標注的單位為sp。當系統的字體大小發(fā)生變化的時候sp的度量標準發(fā)生了變化念祭,這個時候汰蓉,系統會給app發(fā)送一個通知,告訴它配置已經變了棒卷,需要重新刷新界面顾孽。類似的操作就像是橫豎屏切換,在onConfigurationChanged()方法里面進行需要的操作的配置比规。
在橫豎屏切換的時候若厚,會走的生命周期方法是onDestroy(),onCreate()。一般我們的應用通常的配置是設定一個固定的方向讓它避免橫豎屏的切換蜒什。然后配置configChanges屬性测秸,防止界面的銷毀和重建。
android:screenOrientation="portrait"
android:configChanges="orientation|screenSize|keyboardHidden
回到問題本身灾常,發(fā)生問題的原理是這樣的:系統字體大小發(fā)生了變化霎冯,它在app回到前臺的時候發(fā)送了一個通知告訴app。app此時走的生命周期的方法是
onDestroy()
onCreate()
onResume()
通過這樣的操作進行UI界面的刷新钞瀑。**重點來了:**此時app是作為一種異常走的onDestroy()方法沈撞,并不是正常的按返回鍵進行的退出執(zhí)行的onDestroy()。這個時候系統會自動在onSaveInstanceState()方法里面臨時性的保存之前的界面狀態(tài)或者變量信息雕什。方便在onCreate()的時候缠俺,從bundle里面直接取出來使用显晶。但是畢竟是異常的狀態(tài),有些實體的信息或者fragment堆棧的狀態(tài)恢復的時候就有可能錯亂壹士,導致顯示效果出錯或者crash磷雇。
解決方法:
android:configChanges="orientation|screenSize|keyboardHidden|**fontScale**
1.添加fontScale屬性,避免系統字體發(fā)生變化的時候躏救,重新create界面唯笙。如果僅僅這樣處理,app的在從后臺切換到前臺的時候盒使,字體會隨著系統的字體大小發(fā)生變化崩掘。
2.把app里面字體的單位,由sp改為dp忠怖,這樣呢堰,app的字體展示就不會隨著系統的字體變化而發(fā)生變化抄瑟。
可以根據產品的需要自行進行配置凡泣。
解決完上面的問題了,有善于思考的同學就問了皮假,這個是解決切換系統的字體大小產生的問題鞋拟,如果我切換系統字體的樣式呢?出現問題又該怎么解決惹资?
其實有了上面的基礎贺纲,解決這個問題就容易的多了。
在切換字體大小的時候褪测,我們知道系統會發(fā)送通知猴誊,我們設置fontScale屬性就可以了。但是切換字體的樣式侮措,系統并沒有通知懈叹,谷歌官方也沒有,stack上也是各種提問分扎,沒有找到監(jiān)聽的事件或者方法澄成。
切換樣式之后,我們可以觀察一下Activity的生命周期畏吓,依然是onDestroy(),onCreate()....因為是異常的destroy墨状,系統會把當前的狀態(tài)信息存入saveInstanceState()方法里面的bundle,onCreate()的時候菲饼,從bundle里面取出來進行恢復肾砂。有時候,保存的bundle狀態(tài)不對宏悦,導致界面加載錯亂通今。
解決的方法:
在onCreate()的時候粥谬,判斷bundle里面是否有數據,如果有數據辫塌,進行賦空處理漏策,然后走一遍正常的流程,就可以了臼氨。具體代碼如下:
@Override
protectedvoidonCreate(Bundle savedInstanceState) {
**if(null!= savedInstanceState)
savedInstanceState =null;**
super.onCreate(savedInstanceState);}
這個配置可以放在項目的BaseActivity里面掺喻,可以減少對現有代碼的改動。
思考:其實這個時候储矩,你會發(fā)現感耙,在切換字體大小的時候,也可以這樣配置持隧,甚至這樣配置之后就不用管fontScale之類的屬性了即硼,讓界面自己刷新去吧,反正第二次的onCreate()跟重新進入app效果是一樣的屡拨。
小結:博主最近才開始寫博客只酥,記錄一些工作中遇到的坑,分享出來讓做開發(fā)的小伙伴們能快速的繞過這些坑呀狼,提高效率裂允。如果文章有不對的地方,請幫忙指正出來哥艇,謝謝绝编。
當時查閱的資料網址也感謝其他博主的無私分享:
http://blog.csdn.net/murphykwu/article/details/24774015">http://blog.csdn.net/murphykwu/article/details/24774015
http://blog.csdn.net/zhuqiang1002/article/details/38756127">http://blog.csdn.net/zhuqiang1002/article/details/38756127