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;
}
相关文章
|
5月前
|
图形学 Android开发 iOS开发
穿越数字洪流,揭秘Unity3d中的视频魔法!Windows、Android和iOS如何征服RTSP与RTMP的终极指南!
【8月更文挑战第15天】在数字媒体的海洋中,实时视频流是连接世界的桥梁。对于那些渴望在Unity3d中搭建这座桥梁的开发者来说,本文将揭示如何在Windows、Android和iOS平台上征服RTSP与RTMP的秘密。我们将深入探讨这两种协议的特性,以及在不同平台上实现流畅播放的技巧。无论你是追求稳定性的RTSP拥趸,还是低延迟的RTMP忠实粉丝,这里都有你需要的答案。让我们一起穿越数字洪流,探索Unity3d中视频魔法的世界吧!
86 2
|
Android开发
21天打卡Andoid学到的一些小知识-第三四天
今天我想要为大家介绍的是Android 10.0 SystemUI默认去掉底部导航栏这个知识,希望通过我的介绍可以让你了解一部分知识,好吧,废话少说 直接进入正题。
73 0
|
传感器 Java Android开发
21天打卡Andoid学到的一些小知识-第七八天
今天我们打卡学习的内容是Android 10.0 修改导航栏横屏固定在底部显示,首先声明此次打卡学习的链接文章链接将会放置文章最后处,有需要的小伙伴可以自行去查阅观看。
155 0
|
Linux Apache Android开发
21天打卡Andoid学到的一些小知识-第一二天
活动地址:CSDN21天学习挑战赛
88 0
|
监控 API iOS开发
iOS触动精灵模拟触控类外挂原理分析
一、外挂功能: 类似于模拟按键,该类型外挂主要用于通过图像识别,利用luac脚本对图像进行识别。而后再通过私有api实现触屏操作的功能。     二、外挂特征 外挂安装后,会有下面三个主要程序,touchsprite,tsevent,tsdeamon. 其中,touchsprite 为gui的界面程序,其主要功能为提供交互界面由用户选择加载的脚本。(脚本保存在/Us
4220 0
|
Android开发
21天打卡Andoid学到的一些小知识-第十五十六天
学习的最大理由是想摆脱平庸 今天我们学习打卡的内容是:Android 10.0 app获取不到序列号解决方案
117 0
|
Android开发
21天打卡Andoid学到的一些小知识-第十一十二天
今天我们学习打卡的内容是:Android 10.0 Launcher3 禁止首屏时钟AppWidget拖动到其他屏这个知识。
106 0
|
Java Android开发
21天打卡Andoid学到的一些小知识-第十七十八天
今天我们学习打卡的内容是:Android 10.0 屏蔽掉 SystemUI 的通知提示音
82 0
|
Android开发
21天打卡Andoid学到的一些小知识-第九十天
今天我们学习打卡的内容是:Android 9.0 10.0 Launcher3 时钟动态图标的定制化
112 0
|
iOS开发
iOS 页面传值知多少?你真的了解吗?
iOS开发中,页面传值是很常见的,但是页面传值你究竟知道多少呢?笔者这篇文章就是给大家介绍一下页面传值的具体方式,有不足之处,欢迎大家指正,希望能和大家共同进步。说明一下:这里所说的正向、反向传值是指相关联的两个页面间的传值。