今天我们打卡的目标是 Android 10.0 Launcher3 app列表页桌面图标按安装时间排序app图标
在我们日常接触到的定制化开发中,Launcher3相关的定制相关功能是常有的事情,系统默认的app列表页的Icon是按照app名称排序的,同时也会有各种各样的,而今天我们引入安安装时间排序app图标在一定限度上也方便了用户去寻找自己所下载的相关app
按安装时间排序app图标的功能实现分析
在Launcher3中首选找到排序在哪,然后查看排序方法
AlphabeticalAppsList.java 就是负责排序 主要排序的就是Collections.sort(mApps, mAppNameComparator);来负责排序
Collections.sort() 方法 :
Collections.sort(List, new PriceComparator()); 的第二个参数返回一个int型的值,就相当于一个标志,告诉sort方法按什么顺序来对List进行排序。
Collections类中的sort方法可以实现对List接口的集合进行排序。这个方法假定列表元素实现了Comparable接口。
在java文档中查询发现存在两种实现过程
第一种
static <T extends Comparable<? super T>> void sort(List<T> list)
第二种:
public static <T> void sort(List<T> list,Comparator<? super T> c)
Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,至于具体和另一个实现了Comparable接口的类如何比较,则依赖compareTo方法的实现,compareTo方法也被称为自然比较方法。如果开发者add进入一个Collection的对象想要Collections的sort方法帮你自动进行排序的话,那么这个对象必须实现Comparable接口。
若一个类实现了Comparable接口,就意味着“该类支持排序”。 假设“有一个List列表(或数组),里面的元素是实现了Comparable接口的类”,则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序。
此外,“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器。
Comparator接口里面有一个compare方法,方法有两个参数X1和X2,是泛型的表示方式,分别表示待比较的两个对象,方法返回值和Comparable接口一样是int,有三种情况:
(1) X1大于X2,返回正整数
(2) X1等于X2,返回0
(3) X1小于X2,返回负整数
附:其实现主要代码以及代码分析在打卡官方文档中出现,有兴趣的大家也可以去官方帖下面去进行学习,链接会在文章最后放出。
主要实现代码:
import android.content.pm.PackageInfo; import android.content.pm.PackageManager; @Override public int compare(AppInfo a, AppInfo b) { // Order by the title in the current locale /int result = mLabelComparator.compare(a.title.toString(), b.title.toString());if (result != 0) {return result;}/ //add code start String a_packagename = a.componentName.getPackageName(); String b_packagename = b.componentName.getPackageName(); int result = getInstallTime(a_packagename).compareTo(getInstallTime(b_packagename)); if (result != 0) { return result; } //add code end // If labels are same, compare component names result = a.componentName.compareTo(b.componentName); if (result != 0) { return result; } if (mMyUser.equals(a.user)) { return -1; } else { Long aUserSerial = mUserManager.getSerialNumberForUser(a.user); Long bUserSerial = mUserManager.getSerialNumberForUser(b.user); return aUserSerial.compareTo(bUserSerial); } } //根据包名获取安装时间 public String getInstallTime(String packageName){ String installtime =""; try { PackageManager mPackageManager = mContext.getPackageManager(); PackageInfo packageInfo = mPackageManager.getPackageInfo(packageName,0); installtime = packageInfo.firstInstallTime+""; android.util.Log.e("MainActivity","packageName:"+packageName+"--installtime:"+installtime); } catch (Exception e) { e.printStackTrace(); } return installtime; }