[FAQ08556]如何将主菜单图标改成按安装时间排序

[DESCRIPTION]

Launcher主菜单图标默认是按名称来排序的,如何将主菜单改成按安装时间来排序?

[SOLUTION]

M:

  1. 参考AppNameComparator.java新增:AppInstallTimeComparator.java;
  2. 在AlphabeticalAppsList.java新增变量:

    1. private AppInstallTimeComparator mAppInstallTimeComparator;
  3. 修改AlphabeticalAppsList.java 的构造函数:

    1. mAppNameComparator = new AppNameComparator(context);
    2. // 替换成:
    3. mAppInstallTimeComparator= new AppInstallTimeComparator(context);
  4. 修改AlphabeticalAppsList.java 的 onAppsUpdated() 方法:

    1. Collections.sort(mApps, mAppNameComparator.getAppInfoComparator());
    2. // 替换成:
    3. Collections.sort(mApps, mAppInstallTimeComparator.getAppInstallTimeComparator());
  5. 修改AlphabeticalAppsList.java 的 onAppsUpdated() 方法:

    1. sectionMap = new TreeMap<>(mAppNameComparator.getSectionNameComparator());
    2. // 替换成:
    3. sectionMap = new TreeMap<>(mAppInstallTimeComparator.getSectionNameComparator());

L以前版本:

  1. 在 LauncherModel.java 中加入如下方法: ```java public static final Comparator getInstallTimeComparator() { return new Comparator() { public final int compare(AppInfo a, AppInfo b) {
    1. return a.firstInstallTime == b.firstInstallTime ? 0 : a.firstInstallTime > b.firstInstallTime ? 1:-1;
    } }; }

public static class InstallTimeComparator implements Comparator {

  1. private PackageManager mPackageManager;
  2. List<ResolveInfo> mapps;
  3. InstallTimeComparator(PackageManager pm, List<ResolveInfo> apps) {
  4. mPackageManager = pm;
  5. mapps = apps;
  6. }
  7. public final int compare(ResolveInfo a, ResolveInfo b) {
  8. String packageNameA = a.activityInfo.applicationInfo.packageName;
  9. String packageNameB = b.activityInfo.applicationInfo.packageName;
  10. long firstInstallTimeA = 0, firstInstallTimeB = 0;
  11. try{
  12. firstInstallTimeA = mPackageManager.getPackageInfo(packageNameA, 0).firstInstallTime;
  13. firstInstallTimeB = mPackageManager.getPackageInfo(packageNameB, 0).firstInstallTime;
  14. }catch(Exception e){
  15. e.printStackTrace();
  16. return 0;
  17. }
  18. return firstInstallTimeA == firstInstallTimeB ? 0 : firstInstallTimeA > firstInstallTimeB ? 1:-1;
  19. }

};

  1. 2. 修改 LauncherModel.java loadAllAppsByBatch() 方法:
  2. ```java
  3. Collections.sort(apps,new LauncherModel.ShortcutNameComparator(packageManager, mLabelCache));
  4. // 替换成:
  5. Collections.sort(apps,new InstallTimeComparator(packageManager, apps));
  1. 修改 AppsCustomizePagedview.java 的 setApps 方法

    1. Collections.sort(mApps, LauncherModel.getAppNameComparator());
    2. // 替换成:
    3. Collections.sort(mApps, LauncherModel.getInstallTimeComparator());
  2. reorderApps()在某些条件下会被调用,如果要求在那些条件下也要达到按照安装时间排序,请在调用reorderApps方法前增加

    1. Collections.sort(mApps, LauncherModel.getInstallTimeComparator());

例如:新安装应用后仍然要按照安装时间排序,需要在AppsCustomizePagedview.java的addApps方法中增加sort的调用。如下:

[转][M][Launcher]主菜单图标改成时间排序 - 图1