需求: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; } } } }
private ArrayList<ApplicationInfo> mApps;
private ArrayList<ApplicationInfo> mApps; Collections.sort(mApps, LauncherModel.getAppNameComparator()); reorderApps();