问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Android 12桌面抽屉应用图标显示与排序自定义实现

创作时间:
2025-03-19 22:24:14
作者:
@小白创作中心

Android 12桌面抽屉应用图标显示与排序自定义实现

引用
CSDN
1.
https://blog.csdn.net/csdn_1233/article/details/144709730

在Android 12系统中,桌面抽屉(即向上滑动显示所有应用图标的区域)的应用图标显示顺序默认是按照字母排序的。但是,通过修改系统源码,我们可以实现自定义应用图标的显示顺序,例如将常用应用放在前面。本文将详细介绍如何实现这一功能。

技术实现原理

抽屉里面应用图标的显示加载在packages/apps/Launcher3/src/com/android/launcher3/allapps/AlphabeticalAppsList.java里面进行加载,具体的实现方法是onAppsUpdated()

根据方法里的代码了解到,最后刷新展示的调用的是updateAdapterItems(),它又拿的是List<AppInfo> mApps里的东西来直接展示的,也就是说mApps里面哪个软件在前面,展示出来那个软件就在前面,所以我们先建立一个数组来存放需要展示的软件。

/**
    *	在系统列表中取得需要排序的APP组成一个列表
    */
    private List<AppInfo> getSortArrayApps(){
    //需要排序的APP的包名和启动类
     String[] appPackageAndClassName = new String[]{
        //联系人,时钟,文档,音乐
            "com.android.contacts/com.android.contacts.activities.PeopleActivity",
            "com.android.deskclock/com.android.deskclock.DeskClock",
            "com.android.documentsui/com.android.documentsui.LauncherActivity",
            "com.android.music/com.android.music.MusicBrowserActivity"
        };
     String packageName = null;
     String className = null;
     List<AppInfo> sortAppsArray = new ArrayList<>();
     for(int i=0; i<appPackageAndClassName.length; i++){		
            packageName = appPackageAndClassName[i].split("/")[0];
            className = appPackageAndClassName[i].split("/")[1];
            for(int j=0; j<mApps.size(); j++){
                if(mApps.get(j).componentName.getPackageName().equals(packageName)
                    && mApps.get(j).componentName.getClassName().equals(className)){	
                    sortAppsArray.add(mApps.get(j));
                    break;
                }
            }
        }
        return sortAppsArray;
    }  

上述这种软件包名“com.android.contacts/com.android.contacts.activities.PeopleActivity"需要自己打个log查看,如果知道就不用,具体是在public void onAppsUpdated()下。

拿到包名后就可以按照1-2的方法填充数组,之后就需要吧填充的数据放入 mApps内。

/**
    *	将需要排序的和不需排序的列表传入,当排序列表放在前面
    */
    private void setAndSortNewAllApps(){
    //  List<AppInfo> newAppsArray = new ArrayList<>();
     List<AppInfo> arrayApps = getSortArrayApps();
    //  List<AppInfo> notArrayApps = getOutArrayApps();
        
    //  if(arrayApps.size()>0 && notArrayApps.size()>0){
    // 		//对集合2进行排序
    // 		Collections.sort(notArrayApps, mAppNameComparator);
    // 		if(false){
    // 			//合并集合1和2,并将集合1放在后面
    // 			notArrayApps.addAll(arrayApps);
    // 			newAppsArray = notArrayApps;
    // 		}else{
    // 			//合并集合1和2,并将集合1放在前面
    // 			arrayApps.addAll(notArrayApps);
    // 			newAppsArray = arrayApps;
    // 		}
    // 		//将集合mApps清空				
    // 		mApps.clear();
    // 		//将集合1和集合2合并后放入mApps集合
    // 		mApps.addAll(newAppsArray);
    // 	}
        mApps.clear();
        mApps.addAll(arrayApps);
    }  

之后需要把onAppsUpdated()方法内这几行注释掉,因为这里重新排序填充了mApps,但是我们不需要,所以要注释掉。

最后在 onAppsUpdated()方法内添加1-4的方法并把Collections注释就行了,最后就会在桌面抽屉里展示联系人,时钟,文档,音乐这几个软件图标。

如果想所有软件都展示,只是想对个别软件进行排序,出来1-2的方法,还需要添加以下方法。

/**
    *	在系统列表中取得不需要排序的APP组成一个列表
    */
    private List<AppInfo> getOutArrayApps(){
        List<AppInfo> outAppsArray = new ArrayList<>(mApps);
        //从mApps中移除需要排序的应用
        outAppsArray.removeAll(getSortArrayApps());
        return outAppsArray;
    }  

修改1-4的方法

/**
    *	将需要排序的和不需排序的列表传入,当排序列表放在前面
    */
    private void setAndSortNewAllApps(){
     List<AppInfo> newAppsArray = new ArrayList<>();
     List<AppInfo> arrayApps = getSortArrayApps();
     List<AppInfo> notArrayApps = getOutArrayApps();
        
     if(arrayApps.size()>0 && notArrayApps.size()>0){
            //对集合2进行排序
            Collections.sort(notArrayApps, mAppNameComparator);
            if(false){
                //合并集合1和2,并将集合1放在后面
                notArrayApps.addAll(arrayApps);
                newAppsArray = notArrayApps;
            }else{
                //合并集合1和2,并将集合1放在前面
                arrayApps.addAll(notArrayApps);
                newAppsArray = arrayApps;
            }
            //将集合mApps清空				
            mApps.clear();
            //将集合1和集合2合并后放入mApps集合
            mApps.addAll(newAppsArray);
        }
        // mApps.clear();
        // mApps.addAll(newAppsArray);
    }  

最后1-5和1-6保持不变,这些地方还是需要注释掉,最后展示出来就会出现联系人,时钟,文档,音乐这几个软件在最前面,后面是其他软件。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号