android-settings新增字型更換-中篇-FontStyle更換的解決方案
想到字型更換,首先最簡單的山寨方法,應該是想著可以替換系統的ttf字型檔案,然後手動重啟,系統根據目錄和名稱找到該檔案,構造Typeface,然後TextView使用這個Typeface。
但是,作為一個可以釋出的應用,應該不可以這樣(可以討論),方法應該有很多種,懇請各位大神指導,MTK文件提供了一種方案,來看看這種基於此的一種方案。(效果可參考三星,其內部實現不太清楚)。
字型作為一種特殊的資源,其表現可參考,fontScale的設定過程,在Settings的原始碼包裡面的Display_setting中可以看到,FontScale更改後修改到SystemSetting的資料庫,同時呼叫ActivityManagerService(AMS)的updateConfiguration,更新相關資源,重啟所有可見視窗,達到目的。
public void writeFontSizePreference(Object objValue) { try { mCurConfig.fontScale = Float.parseFloat(objValue.toString()); ActivityManagerNative.getDefault().updatePersistentConfiguration(mCurConfig); } catch (RemoteException e) { Log.w(TAG, "Unable to save font size"); } }
(補充說明:呼叫服務不太瞭解的先看看android服務框架,同時學習AMS,也可看做直接呼叫)
類似於上面,選擇FontStyle,更新資源,通知AMS 配置已經更改,重啟Activity。
需要修改的系統檔案,
Configuration.java---新增有關字型的屬性(我們用包名和路徑來確定:原因下篇講)、修改相應的diff,update,write,read等函式,
ActivityInfo.java---新增FontStyle屬性值常量(參考FontScale)。
AMS.java---新增成員變數,在初始化的函式中,從檔案中獲取FontStyle屬性值。在updateConfigrationLock函式中,儲存FontStyle屬性值到檔案。
( 這樣保證了開機後可以使用上次儲存的字型)
TextVIew.java---修改初始化函式,在設定字型、前設定判斷,若為預設則呼叫原方法,
當FontStyle屬性值不為預設時從FontStyle屬性來重新構造Typeface。
這樣修改後,理論上修改FontStyle後會重啟所有Activity,來修改字型,不過很快就會發現一
個問題,即,狀態列的字型沒有修改,這是因為SystemUI是一個特殊的apk,AMS的重啟沒
有包括SystemUI,我們需要自己新增修改,這樣在Intent.java中新增一個廣播常量字串,
在AMS的updateConfigrationLock中,發出字型改變的廣播,SystemUI的PhoneStatusBar
中接收廣播,更新所有的TextVIew就OK了。
(僅僅為一種方案,具體細節不再贅述)