需求
通过黑白名单,控制Launcher & <我的应用> 应用显示或者不显示(展示应用图标)
实现
核心实现在ApplicationPackageManager,getInstalledPackages和queryIntentActivities 中进行拦截
frameworks/base/core/java/android/app/ApplicationPackageManager.java
public List<PackageInfo> getInstalledPackages(int flags) {
//return getInstalledPackagesAsUser(flags, mContext.getUserId());
List<PackageInfo> infos = getInstalledPackagesAsUser(flags, mContext.getUserId());
if (null != infos && infos.size() > 0) {
Set<String> pkgSet = getNotDisplayInLauncherPkg();
boolean isSystemApp = isSystemAppType();
Iterator it = infos.iterator();
while (it.hasNext()) {
PackageInfo info = (PackageInfo) it.next();
if (notDisplayInLauncher(info.packageName, pkgSet, isSystemApp)) {
it.remove();
}
}
}
return infos;
}
public List<ResolveInfo> queryIntentActivities(Intent intent, int flags) {
List<ResolveInfo> infos = queryIntentActivitiesAsUser(intent, flags, mContext.getUserId());
if (null != intent.getCategories() && intent.getCategories().contains("android.intent.category.LAUNCHER")
&& "android.intent.action.MAIN".equals(intent.getAction())) {
if (null != infos && infos.size() > 0) {
Set<String> pkgSet = getNotDisplayInLauncherPkg();
boolean isSystemApp = isSystemAppType();
Iterator it = infos.iterator();
while (it.hasNext()) {
ResolveInfo info = (ResolveInfo) it.next();
if (notDisplayInLauncher(info.activityInfo.packageName, pkgSet, isSystemApp)) {
it.remove();
}
}
}
}
return infos;
}
辅助函数
private boolean isSystemAppType() {
try {
PackageInfo pInfo = getPackageInfo(mContext.getPackageName(), 0);
if (isSystemApp(pInfo) || isSystemUpdateApp(pInfo)) {
return true;
} else {
return false;
}
} catch (NameNotFoundException e) {
e.printStackTrace();
}
return false;
}
private boolean isSystemApp(PackageInfo pInfo) {
return ((pInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0);
}
private boolean isSystemUpdateApp(PackageInfo pInfo) {
return ((pInfo.applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0);
}
private boolean notDisplayInLauncher(String packageName, Set<String> pkgSet, boolean isSystemApp) {
if (null != pkgSet && pkgSet.contains(packageName)) {
return true;
}
//如果是系统应用,则不进行过滤
if (!isSystemApp) {
try {
PackageInfo pInfo = getPackageInfo(packageName, 0);
if (isSystemApp(pInfo) || isSystemUpdateApp(pInfo)) {
return true;
}
} catch (NameNotFoundException e) {
e.printStackTrace();
}
}
return false;
}
private Set<String> getNotDisplayInLauncherPkg () {
Set<String> pkgSet = new HashSet<String>();
pkgSet.add("com.android.browser");
// pkgSet.add("com.android.settings");
// pkgSet.add("com.android.tv.settings");
// pkgSet.add("com.android.camera2");
//ThirdPartyPermissions.getInstalledAdApps 这里为自定义的黑名单,可自行定义
List<String> installedAdApps = ThirdPartyPermissions.getInstalledAdApps(mContext);
if (installedAdApps != null && installedAdApps.size() > 0) {
for (String pkgName : installedAdApps) {
pkgSet.add(pkgName);
}
}
return pkgSet;
}