PS:标题所说的桌面抽屉就是在桌面往上滑出现有所有应用图标的地方
1-1、抽屉里面应用图标的显示加载在packages/apps/Launcher3/src/com/android/launcher3/allapps/AlphabeticalAppsList.java里面进行加载,具体的实现方法是onAppsUpdated()
1-2、根据方法里的代码了解到,最后刷新展示的调用的是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;
}
1-3、上述这种软件包名“com.android.contacts/com.android.contacts.activities.PeopleActivity"需要自己打个log查看,如果知道就不用,具体是在public void onAppsUpdated()下。
1-4、拿到包名后就可以按照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);
}
1-5、之后需要把onAppsUpdated()方法内这几行注释掉,因为这里重新排序填充了mApps,但是我们不需要,所以要注释掉。
1-6、最后在 onAppsUpdated()方法内添加1-4的方法并把Collections注释就行了,最后就会在桌面抽屉里展示联系人,时钟,文档,音乐这几个软件图标。
1-7,如果想所有软件都展示,只是想对个别软件进行排序,出来1-2的方法,还需要添加以下方法。
/**
* 在系统列表中取得不需要排序的APP组成一个列表
*/
private List<AppInfo> getOutArrayApps(){
List<AppInfo> outAppsArray = new ArrayList<>(mApps);
//从mApps中移除需要排序的应用
outAppsArray.removeAll(getSortArrayApps());
return outAppsArray;
}
1-8、修改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-9、最后1-5和1-6保持不变,这些地方还是需要注释掉,最后展示出来就会出现联系人,时钟,文档,音乐这几个软件在最前面,后面是其他软件。