回答我自己的问题。这是一个关于从图标包加载图标的简短教程(包含伪代码)。
获取已安装的图标包
查找带有意图过滤器com.gau.go.launcherex.theme 或org.adw.launcher.THEMES 的应用。可能其他人也存在。
使用例如
PackageManager.queryIntentActivities(new Intent("org.adw.launcher.THEMES"), PackageManager.GET_META_DATA);
加载 appfilter.xml
它可以作为资源找到,也可以在图标包的 assets 文件夹中找到。使用任一
int i = Resources.getIdentifier("appfilter", "xml", "iconpack.package.name");
Resources.getXml(i);
或
InputStream s = iconPackres.getAssets().open("appfilter.xml");
XmlPullParserFactory f = XmlPullParserFactory.newInstance();
f.setNamespaceAware(true);
XmlPullParser p = f.newPullParser();
p.setInput(s, "utf-8");
解析 appfilter.xml
Appfilter.xml 描述图标包内容。除其他外,themer 能够在背景上绘制图标、提供蒙版等。这在 XDA 上都有描述:http://forum.xda-developers.com/showthread.php?t=1649891。我们最感兴趣的是<item> 标签,例如
<item component="ComponentInfo{com.android.browser/com.android.browser.BrowserActivity}" drawable="com_android_browser_browseractivity" />
component 属性包含包和活动的名称,drawable 是图标包中匹配图标的名称。循环遍历上一步中的XmlPullParser 以找到您想要的图标。
加载图标
只需获取要加载其图标的应用的组件名称
PackageManager.getLaunchIntentForPackage("app.package.name").getComponent().toString();
比用
加载图标
Resources.getIdentifier(componentName, "drawable", "app.package.name");
Resources.getDrawable(...)