You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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));
}

关键说明:

  1. 将pm.queryIntentActivities(i, 1)替换为pm.queryIntentActivities(i, PackageManager.MATCH_ALL),使用常量让代码更易读,避免魔数。
  2. 添加应用类型判断:排除系统预装且未被更新的应用,只保留用户安装的应用,以及被用户更新过的系统应用。

内容的提问来源于stack exchange,提问作者Thomas Basile

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 07:22:48