Android应用过滤异常:遍历忽略列表时结果重复且不符合预期
问题分析
你的代码逻辑存在两个关键问题,直接导致了重复添加和过滤失效的现象:
错误的遍历判断逻辑:你当前的写法是遍历
ignoreList中的每一个元素,只要当前元素和应用名称不匹配,就把这个应用添加一次。这意味着一个应用会被添加ignoreList.length - 匹配的元素个数次——比如Chrome包含"Chrome",遍历到这个元素时不会添加,但遍历到ignoreList里其他20个元素时都会执行添加操作,所以出现了20个Chrome的重复项。同时,只要有一个ignore元素不匹配,应用就会被添加,完全起不到过滤作用。静态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
相关产品推荐
相关产品推荐

