android-settings新增字型更換-後篇-FontManger的apk實現
在寫後篇的時候,一個週末已經過去了,程式碼什麼的忘了個一乾二淨,不過我也沒想過要貼原始碼,那麼就開始吧。
因為是使用者可選擇的字型,為了後期可擴充套件,我們考慮使用者可以自己下FontStyle,那麼存在兩種可能了,一是下ttf檔案,而是包裝了ttf檔案的apk,如果是ttf檔案造成的問題可能就是,不便於管理,你可能將ttf檔案放到任何地方,影響載入,也不夠穩定,使用apk,我們設定這些apk的包名的字首是特定的,那麼我們載入字型時,根據包管理器(packetManager)來獲取特定字首的包,根據其ttf資源獲取其路徑,來確定唯一的字型資源,在TextView載入字型時,再根據FontPakName和FontPath來載入資源。
需要注意的是,我們主要的功能用例:掃描字型檔案,選擇字型檔案,從Maket獲取其他字型。
1、掃描所有字型檔案,開始已經說了,藉助PacketManager獲得特定模式的包。
2、更新系統字型,選擇確定後,判斷字型屬性是否改變,設定新的Configuration,呼叫AMS的更新配置函式。
try { mCurConfig.fontPacName&fontPath ; ActivityManagerNative.getDefault().updatePersistentConfiguration(mCurConfig); } catch (RemoteException e) { Log.w(TAG, "Unable to update font style"); }
3、Market獲取新字型,這個很簡單,startActivity就OK了。
public void onClick(View v) { // TODO Auto-generated method stub try { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://search?q=font")); startActivity(intent); } catch (ActivityNotFoundException e) { // TODO: handle exception String mems = "獲取Market失敗,請檢查是否安裝"; Toast.makeText(MainActivity.this, mems, Toast.LENGTH_LONG).show(); } }
功能很簡單,卻容易出現一些問題:
比如UI更新問題,字型的載入和更新過程都有1-2秒的延遲,字型載入可以用AsynTask,主執行緒用ProgressDialog來顯示,而字型更新過程,至今沒有想到好的方法,有一點點想法,都需要複雜的實現,問題是這樣的,UpdateConfig的過程中,會重啟AMS中ActivityStack的Activity,那麼在這個過程中,會出現由於重啟視窗的閃一下的問題。還望大家提供一些想法。
比如異常處理,獲取Market的過程中,如果沒有安裝GooglePlay和類似的軟體會出現強制退出的問題。呼叫AMS屬於跨程序的呼叫,remoteException等。