需求:Launcher主菜单中某些应用程序必须放在最前面的几个位置,且顺序是固定的,切换预研等操作也不能更改其顺序。
修改方案:编辑Launcher2/res/xml/default_toppackage.xml文件
<app
launcher:topPackageName="com.yahoo.mobile.client.android.odp"
launcher:topClassName="com.yahoo.mobile.client.android.odp.YahooODP"
launcher:topOrder="4"
/>
<app
launcher:topPackageName="com.yahoo.mobile.client.android.im"
launcher:topClassName="com.yahoo.mobile.client.android.im.YahooMessenger"
launcher:topOrder="5"
/>
类似文件中的写法,填写你的应用的包名和class name,以及希望它显示的顺序(最小为0)
分析:下面来简单分析在代码中是如何实现的。
AllAppsList.java类中有个静态类TopPackage,非常简单的类,只有三个成员变量和一个构造方法,用来存储default_toppackage.xml文件中配置的一项:
static class TopPackage {
public TopPackage(String pkgName, String clsName, int index) {
packageName = pkgName;
className = clsName;
order = index;
}
String packageName;
String className;
int order;
}
AllAppsList.java类中有个静态变量sTopPackages,用来存储所有在default_toppackage.xml文件中的配置:
static ArrayList<TopPackage> sTopPackages = null;
有个静态方法负责解析这个xml文件,并把信息保存到sTopPackages中:
static boolean loadTopPackage(final Context context)
在LauncherModel.java的startLoader方法中调用AllAppsList.loadTopPackage(mApp)来解析xml文件。
解析后的使用是在
public void reorderApps() {
if (LauncherLog.DEBUG) {
LauncherLog.d(TAG, "reorderApps: mApps = " + mApps + ", this = " + this);
}
if (AllAppsList.sTopPackages == null || mApps == null || mApps.isEmpty()
|| AllAppsList.sTopPackages.isEmpty()) {
return;
}
ArrayList<ApplicationInfo> dataReorder = new ArrayList<ApplicationInfo>(
AllAppsList.DEFAULT_APPLICATIONS_NUMBER);
for (AllAppsList.TopPackage tp : AllAppsList.sTopPackages) {
for (ApplicationInfo ai : mApps) {
if (ai.componentName.getPackageName().equals(tp.packageName)
&& ai.componentName.getClassName().equals(tp.className)) {
mApps.remove(ai);
dataReorder.add(ai);
break;
}
}
}
for (AllAppsList.TopPackage tp : AllAppsList.sTopPackages) {
int newIndex = 0;
for (ApplicationInfo ai : dataReorder) {
if (ai.componentName.getPackageName().equals(tp.packageName)
&& ai.componentName.getClassName().equals(tp.className)) {
newIndex = Math.min(Math.max(tp.order, 0), mApps.size());
mApps.add(newIndex, ai);
break;
}
}
}
}
在AppsCustomizePagedView.java的setApps、addApps、removeApps和updateApps方法中都会调用reorderApps来重新修改mApps中存储的各应用的顺序,当然,应该是在正常的排序结束后才根据你的配置重新再排序:
private ArrayList<ApplicationInfo> mApps;
private ArrayList<ApplicationInfo> mApps;
Collections.sort(mApps, LauncherModel.getAppNameComparator());
reorderApps();