Android如何仅获取用户应用列表?自制启动器遇系统应用问题
解决Android应用启动器只显示用户应用的问题
你当前的代码仅过滤掉了自身应用,但没有区分系统应用和用户应用,所以会包含系统预装的LAUNCHER类应用。要只显示用户应用(包括用户安装的应用、以及被用户更新过的系统应用如Play Store),可以通过ApplicationInfo的flags来判断:
ApplicationInfo.FLAG_SYSTEM:标记该应用是系统预装应用ApplicationInfo.FLAG_UPDATED_SYSTEM_APP:标记系统应用被用户更新过(这类应用通常也需要展示)
修改后的代码如下:
public AppListAdapter(Context context) { this.context = context; appList = new ArrayList<>(); PackageManager pm = context.getPackageManager(); Intent i = new Intent(Intent.ACTION_MAIN, null); i.addCategory(Intent.CATEGORY_LAUNCHER); String this_app_name = context.getString(R.string.app_name); List<ResolveInfo> allApps = pm.queryIntentActivities(i, PackageManager.MATCH_ALL); for (ResolveInfo ri : allApps) { String app_name = ri.loadLabel(pm).toString(); ApplicationInfo appInfo = ri.activityInfo.applicationInfo; // 过滤自身应用,同时只保留用户应用或更新过的系统应用 if (!app_name.contains(this_app_name) && ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0 || (appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0)) { appList.add(appInfo); } } Collections.sort(appList, new ApplicationInfo.DisplayNameComparator(pm)); }
关键说明:
- 将
pm.queryIntentActivities(i, 1)替换为pm.queryIntentActivities(i, PackageManager.MATCH_ALL),使用常量让代码更易读,避免魔数。 - 添加应用类型判断:排除系统预装且未被更新的应用,只保留用户安装的应用,以及被用户更新过的系统应用。
内容的提问来源于stack exchange,提问作者Thomas Basile
相关产品推荐
相关产品推荐

