如何定制Launcher主菜单中应用程序的显示顺序

来源:互联网 发布:java json日期格式化 编辑:程序博客网 时间:2024/05/17 01:57

需求: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();

0 0
原创粉丝点击