今天我们打卡的目标是 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;
}