在android N 的Launcher3中隐藏某些app应用图标

在android N 的Launcher3中隐藏某些app应用图标

桌面应用整理有些app应用不想要显示在桌面上,去掉这些应用图标的话,修改Launcher3 代码里的LauncherModel.java 
在LauncherModel里有个方法loadAllapps加载了所有app,我就是在这里隐藏某些app

private void loadAllApps() {
final long loadTime = DEBUG_LOADERS ? SystemClock.uptimeMillis() : 0;

final Callbacks oldCallbacks = mCallbacks.get();
if (oldCallbacks == null) {
// This launcher has exited and nobody bothered to tell us.  Just bail.
Log.w(TAG, "LoaderTask running with no launcher (loadAllApps)");
return;
}

final List<UserHandleCompat> profiles = mUserManager.getUserProfiles();

// Clear the list of apps
mBgAllAppsList.clear();
for (UserHandleCompat user : profiles) {
// Query for the set of apps
final long qiaTime = DEBUG_LOADERS ? SystemClock.uptimeMillis() : 0;
final List<LauncherActivityInfoCompat> apps = mLauncherApps.getActivityList(null, user);
if (DEBUG_LOADERS) {
Log.d(TAG, "getActivityList took "
+ (SystemClock.uptimeMillis()-qiaTime) + "ms for user " + user);
Log.d(TAG, "getActivityList got " + apps.size() + " apps for user " + user);
}
// Fail if we don't have any apps
// TODO: Fix this. Only fail for the current user.
if (apps == null || apps.isEmpty()) {
return;
}
boolean quietMode = mUserManager.isQuietModeEnabled(user);
                // Create the ApplicationInfos
for (int i = 0; i < apps.size(); i++) {
LauncherActivityInfoCompat app = apps.get(i);
                    if (DEBUG_LOADERS)
                        Log.e(TAG,"loadAllPackages = "+app.getComponentName().getPackageName());
                    //Modify by yy,does not add unuse apps
                    //在这里根据app包名判断该应用是否在不需要显示的列表里,如果是就不add到mBgAllAppsList
                    if(!excludePackage(mContext,app.getComponentName().getPackageName())){
    // This builds the icon bitmaps.
    mBgAllAppsList.add(new AppInfo(mContext, app, user, mIconCache, quietMode));
                    }
                    //end Modify by yy
}
....

private boolean excludePackage(Context context,String packageName){
    //get no add apps
    if(excludePackageArray == null)
        excludePackageArray = context.getResources().getStringArray(R.array.excludePackageList);
    return Arrays.asList(excludePackageArray).contains(packageName);

}

有兴趣的话可以看看mBgAllAppsList 也就是AllAppsList 
在AllAppsList里管理了所有的app和app的更新。

做到这里的时候发现有个问题,比如某个app在loadAllApps 已经去除了,但是有时候还会突然冒出来,查看了AllAppsList 发现它有个updatePackage 方法,在这里面也会将app add到AllAppsList的app list里面。 
根据它找到在LauncherModel有个PackageUpdatedTask的类操作,在这里会更新桌面的应用。所以我就在这里的update里也进行excludePackage方法的判断

            case OP_UPDATE:
                for (int i=0; i<N; i++) {
                    if (DEBUG_LOADERS) Log.d(TAG, "mAllAppsList.updatePackage " + packages[i]);
                    //Modify by yy,does not add unuse apps
                    if(!excludePackage(context,packages[i])){
                        mIconCache.updateIconsForPkg(packages[i], mUser);
                        mBgAllAppsList.updatePackage(context, packages[i], mUser);
                        mApp.getWidgetCache().removePackage(packages[i], mUser);
                    }//end Modify by yy
                }
                // Since package was just updated, the target must be available now.
                flagOp = FlagOp.removeFlag(ShortcutInfo.FLAG_DISABLED_NOT_AVAILABLE);
                break;

猜你喜欢

转载自blog.csdn.net/CodingNotes/article/details/82659144