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

Android应用过滤异常:遍历忽略列表时结果重复且不符合预期

问题分析

你的代码逻辑存在两个关键问题,直接导致了重复添加和过滤失效的现象:

  1. 错误的遍历判断逻辑:你当前的写法是遍历ignoreList中的每一个元素,只要当前元素和应用名称不匹配,就把这个应用添加一次。这意味着一个应用会被添加ignoreList.length - 匹配的元素个数次——比如Chrome包含"Chrome",遍历到这个元素时不会添加,但遍历到ignoreList里其他20个元素时都会执行添加操作,所以出现了20个Chrome的重复项。同时,只要有一个ignore元素不匹配,应用就会被添加,完全起不到过滤作用。

  2. 静态JSONArray未清空:appInfo是静态变量,如果你多次调用listApps方法,旧的数据会一直保留,导致结果越来越冗余。

修复后的代码
public static JSONArray appInfo = new JSONArray();
public static String[] ignoreList = {"Google", "Maps", "Settings", "Phone", "Chrome", "Photos", "Duo", "YouTube", "Gmail", "Contacts", "Drive", "Clock", "Messages", "Files", "Calculator", "File manager", "Samsung", "Gallery", "LastPass", "OnePlus", "Weather"};

public void listApps(Context c) {
    // 每次调用先清空静态数组,避免累计旧数据
    appInfo = new JSONArray();
    PackageManager pm = c.getPackageManager();
    Intent main = new Intent(Intent.ACTION_MAIN, null);
    main.addCategory(Intent.CATEGORY_LAUNCHER);
    List<ResolveInfo> packages = pm.queryIntentActivities(main, 0);

    for (ResolveInfo resolve_info : packages) {
        try {
            String package_name = resolve_info.activityInfo.packageName;
            String app = (String) pm.getApplicationLabel(pm.getApplicationInfo(package_name, PackageManager.GET_META_DATA));
            
            // 标记当前应用是否需要被忽略
            boolean shouldIgnore = false;
            for (String tempStr : ignoreList) {
                if (app.contains(tempStr)) {
                    shouldIgnore = true;
                    // 找到匹配项后直接跳出循环,无需检查剩余元素
                    break;
                }
            }
            
            // 只有不需要忽略的应用,才添加到JSONArray中
            if (!shouldIgnore) {
                JSONObject json = new JSONObject();
                json.put("app", app);
                appInfo.put(json);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    try {
        Log.d("Debug", appInfo.toString(4));
    } catch (JSONException e) {
        e.printStackTrace();
    }
}
额外优化建议

如果想让代码更简洁,可以用Java 8+的流操作替代手动遍历判断,一行代码就能完成是否忽略的判断:

boolean shouldIgnore = Arrays.stream(ignoreList).anyMatch(app::contains);

这样可以替代原来的for循环,保持逻辑清晰的同时减少代码量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 20:17:38