有些客户要求Luncher中的应用显示按照指定的顺序,实现如下:
先将需要排序的应用包名和类名存放在字符串数组:
- com.android.calculator2/com.android.calculator2.CalculatorSprd
- com.android.dialer/com.android.dialer.app.DialtactsActivity
- com.android.soundrecorder/com.sprd.soundrecorder.RecorderActivity
- com.google.android.calendar/com.android.calendar.AllInOneActivity
- com.android.settings/com.android.settings.Settings
- com.android.deskclock/com.android.deskclock.DeskClock
- com.android.contacts/com.android.contacts.activities.PeopleActivity
- com.android.gallery3d/com.android.gallery3d.app.GalleryActivity
- com.android.documentsui/com.android.documentsui.LauncherActivity
- com.android.camera2/com.android.camera.CameraLauncher
- com.google.android.apps.messaging/com.google.android.apps.messaging.ui.ConversationListActivity
- com.android.music/com.android.music.MusicBrowserActivity
将数组中存放的应用对应的AppInfo对象存放到List集合中:
private List getInArrayApps(){
String[] appPackageAndClassName = mLauncher.getResources().getStringArray(R.array.app_package_and_class_name);
String packageName = null;
String className = null;
List appsInArray = new ArrayList<>();
//遍历字符串数组,并与集合mApps中的应用匹配,匹配成功就add到集合appsInArray中
for(int i=0; i
将集合mApps中需要排序的应用remove掉,把剩下的不需要排序的应用存放在集合appsOutArray中:
private List getOutArrayApps(){
List appsOutArray = new ArrayList<>(mApps);
//从mApps中移除需要排序的应用
appsOutArray.removeAll(getInArrayApps());
return appsOutArray;
}
实现一个功能:将getInArrayApps()函数返回的应用集合(后面称为集合1,排序方式为字符串数组中的顺序)和getOutArrayApps()函数返回的应用集合(后面成为集合2,排序方式为系统默认排序方式,字母排序)一起存放入mApps中,存放前先将mApps清空。既可以将集合1放在前面,也可以将集合1放在后面。
private void setAndSortNewAllApps(List apps01, List apps02){
List newAppsArray = new ArrayList<>();
List arrayApps = apps01;
List notArrayApps = apps02;
if(arrayApps.size()>0 && notArrayApps.size()>0){
//对集合2进行排序
Collections.sort(notArrayApps, mAppNameComparator);
if(mLauncher.getResources().getBoolean(R.bool.hyst_config_array_apps_on_the_back)){
//合并集合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);
}
}
最后用setAndSortNewAllApps函数替换Launcher3中应用排序的代码, 代码在AlphabeticalAppsList.java类中。
代码路径:packages/apps/Launcher3/src/com/android/launcher3/allapps/AlphabeticalAppsList.java
在这个类中找到函数onAppsUpdated(),函数中有行代码如下:
Collections.sort(mApps, mAppNameComparator);
修改如下:
private void onAppsUpdated() {
...........
...........
//省略
...........
...........
if(mLauncher.getResources().getBoolean(R.bool.hyst_config_some_apps_sort)){
setAndSortNewAllApps(getInArrayApps(), getOutArrayApps());
}else {
Collections.sort(mApps, mAppNameComparator);
}
...........
...........
//省略
...........
...........
}
ok!!