当前位置: 首页 > news >正文

关于 java+gradle的弹窗多选应用app

在这里插入图片描述在这里插入图片描述
已过滤系统应用

package com.example.skipAd;import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;import androidx.appcompat.app.AlertDialog;import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;/*** App 选择器工具类(支持多选 + 本地保存 + 回显)*/
public class AppChooserHelper {private final Context context;private final SharedPreferences prefs;private final String prefsKey;private List<String> appNames;private List<String> packageNames;public interface OnAppsSelectedListener {void onAppsSelected(Set<String> selectedApps);}/*** @param context   Activity 或 Application Context* @param prefsName SharedPreferences 名称* @param prefsKey  保存选择的 key*/public AppChooserHelper(Context context, String prefsName, String prefsKey) {this.context = context;this.prefs = context.getSharedPreferences(prefsName, Context.MODE_PRIVATE);this.prefsKey = prefsKey;}/*** 显示多选 App 弹窗*/public void showAppChooserDialog(final OnAppsSelectedListener listener) {final PackageManager pm = context.getPackageManager();List<ApplicationInfo> apps = pm.getInstalledApplications(PackageManager.GET_META_DATA);final Set<String> savedApps = prefs.getStringSet(prefsKey, new HashSet<>());final Set<String> selectedApps = new HashSet<>(savedApps);List<String> selectedAppNames = new ArrayList<>();List<String> otherAppNames = new ArrayList<>();List<String> selectedPackageNames = new ArrayList<>();List<String> otherPackageNames = new ArrayList<>();for (ApplicationInfo app : apps) {// 只显示可启动的第三方应用if (pm.getLaunchIntentForPackage(app.packageName) != null&& (app.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {String name = app.loadLabel(pm).toString();String pkg = app.packageName;if (savedApps.contains(name)) {selectedAppNames.add(name);selectedPackageNames.add(pkg);} else {otherAppNames.add(name);otherPackageNames.add(pkg);}}}// 合并:已选择应用在前appNames = new ArrayList<>();appNames.addAll(selectedAppNames);appNames.addAll(otherAppNames);packageNames = new ArrayList<>();packageNames.addAll(selectedPackageNames);packageNames.addAll(otherPackageNames);// checkedItems 逻辑保持不变boolean[] checkedItems = new boolean[appNames.size()];for (int i = 0; i < appNames.size(); i++) {checkedItems[i] = savedApps.contains(appNames.get(i));}AlertDialog.Builder builder = new AlertDialog.Builder(context);builder.setTitle("选择应用").setMultiChoiceItems(appNames.toArray(new String[0]), checkedItems,(dialog, which, isChecked) -> {if (isChecked) {selectedApps.add(appNames.get(which));} else {selectedApps.remove(appNames.get(which));}}).setPositiveButton("确定", (dialog, which) -> {prefs.edit().putStringSet(prefsKey, selectedApps).apply();if (listener != null) {listener.onAppsSelected(selectedApps);}}).setNegativeButton("取消", null).show();}/*** 获取已选择的应用(回显用)*/public Set<String> getSelectedApps() {return prefs.getStringSet(prefsKey, new HashSet<>());}
}
http://www.xdnf.cn/news/1342711.html

相关文章:

  • 【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day10
  • Jmeter自动化性能测试常见问题汇总
  • FileCodeBox 文件快递柜 一键部署
  • 如何在Vscode中配置MCP服务?(包含实例:使用Github Copilot + 高德MCP查询旅游攻略)
  • MiniOB环境部署开发(使用Docker)
  • Logstash——安全与权限管理
  • Adobe Photoshop 2025 版本介绍与使用指南
  • 最新AI赋能Python-GEE遥感云大数据分析、可视化与Satellite Embedding创新应用
  • 【ElasticSearch】使用docker compose,通过编写yml安装es8.15和kibana可视化界面操作,go连接es
  • 企业级大模型解决方案:架构、落地与代码实现​
  • 视觉语言对比学习的发展史:从CLIP、BLIP、BLIP2、InstructBLIP(含MiniGPT4的详解)
  • [react] js容易混淆的两种导出方式2025-08-22
  • nginx-限速-限制并发连接数-限制请求数
  • 零音乐基础想创作?通过cpolar,ACE-Step远程编曲如此简单
  • 知识见闻 - 苹果无线键盘A1314说明书
  • 【力扣 Hot100】滑动窗口巧解字串问题
  • 新的 SHAMOS MacOS 窃取程序利用单行终端命令攻击用户
  • 开发者中使用——控制台打印数据
  • Linux mmap内存映射
  • tail -f与less的区别
  • 【系统信息相关】datecal命令
  • 使用 TensorBoardX 实现 PyTorch 神经网络可视化:从入门到进阶
  • 【运维进阶】Shell 变量
  • VASPKIT模版INCAR笔记
  • 同题异构解决leetcode第3646题下一个特殊回文数
  • Effective C++ 条款55:熟悉Boost库
  • 2025-08-21 Python进阶2——数据结构
  • imx6ull-驱动开发篇33——platform 平台驱动模型
  • C++ this 指针
  • 分治思想在系统分流削峰中的实践与Golang前沿实现