1. 程式人生 > >android-settings新增字型更換-後篇-FontManger的apk實現

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等。