在写后篇的时候,一个周末已经过去了,代码什么的忘了个一干二净,不过我也没想过要贴源码,那么就开始吧。
因为是用户可选择的字体,为了后期可扩展,我们考虑用户可以自己下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等。