21天打卡Andoid学到的一些小知识-第五六天

简介: 今天我们打卡的目标是 Android 10.0 Launcher3 app列表页桌面图标按安装时间排序app图标

今天我们打卡的目标是 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;
}
相关文章
|
XML Java Maven
在 Cucumber 测试中自动将 Cucumber 数据表映射到 Java 对象
在 Cucumber 测试中自动将 Cucumber 数据表映射到 Java 对象
233 7
|
算法 芯片
基于MPPT最大功率跟踪算法的光伏并网发电系统simulink仿真
本项目采用Simulink仿真构建基于MPPT的最大功率跟踪光伏并网发电系统,自行建立PV模型而非使用内置模块。系统包含MPPT控制器、PI控制器、锁相环及逆变器等,实现光伏阵列在各种条件下高效运行于最大功率点。仿真结果显示光伏并网输出的电流(Ipv)、电压(Upv)及功率(Ppv)波形。通过闭环控制,系统持续调整以维持最佳功率输出,有效提升光伏系统的整体效能和环境适应性。
|
前端开发 JavaScript API
实时搜索建议
实时搜索建议
|
运维 Devops 开发工具
PPT & 回放|打破代码评审难落地魔咒,轻松构建基于代码评审的研发流程和文化
代码评审的好处不言而喻,为何实际落地却困难重重? Git 和 Gerrit社区贡献者、云效Codeup开发者 滕龙认为问题主要出在流程工具问题、时间资源限制、自动化程度不足这3方面。 在昨天的直播中,滕龙给出了详细的解法,包含好的代码评审应该怎么做和如何选对工具高效落地2方面。
1147 1
|
消息中间件 数据可视化 RocketMQ
docker 安装 rocketmq可视化插件
docker 安装 rocketmq可视化插件
415 0
|
JavaScript 前端开发 API
使用three.js与WebGL相比有什么优势?
简单的说Three.js是WebGL的框架。封装和简化了WebGL的方法。three.js在它的基础上进行了进一步的封装和简化开发开发过程,个人认为类似于jQuery对原生js的关系。下面我们一点一点来了解下。
721 0
使用three.js与WebGL相比有什么优势?
|
Java Spring
解析Spring注解:@Resource与@Autowired的区别
在Spring框架中,依赖注入是实现松耦合、可维护性高的应用的重要方式之一。`@Resource`和`@Autowired`是两个常用的注解,用于实现依赖注入。然而,它们在用法和特点上有所不同。本文将详细介绍`@Resource`和`@Autowired`之间的区别,以及在Spring应用中的应用场景。
509 0
|
存储 缓存 NoSQL
【Redis】集合(Hash、List、Set、ZSet)的底层实现原理
【Redis】集合(Hash、List、Set、ZSet)的底层实现原理
|
存储 C++
大整数运算(高精度运算)C/C++
大整数运算(高精度运算)C/C++
503 0
|
机器学习/深度学习 人工智能 自然语言处理
Transformer六周年:当年连NeurIPS Oral都没拿到,8位作者已创办数家AI独角兽
Transformer六周年:当年连NeurIPS Oral都没拿到,8位作者已创办数家AI独角兽
543 0