1. 前言:一场App的“消失魔术”
在定制教育平板时,客户要求:“朕要某些App在桌面上消失,只能在系统设置里当个‘幽灵’,而朕一声令下,它们又得原地复活!”于是,程序员们翻开了Android的《魔法宝典》——PackageManager,准备施展“应用隐身术”。
2. 技术揭秘:PackageManager的“魔杖咒语”
“魔杖”真身:
PackageManager(PM)是Android的“应用大管家”,手握生杀大权:安装、卸载、查询权限,甚至能让App“人间蒸发”。
核心咒语:
-
“统统消失!”:
pm.setApplicationEnabledSetting(包名, COMPONENT_ENABLED_STATE_DISABLED, 0);
App瞬间从桌面消失,连adb shell am start
都喊不动它! -
“给我现身!”:
pm.setApplicationEnabledSetting(包名, COMPONENT_ENABLED_STATE_ENABLED, 0);
App秒变乖孩子,桌面图标满血复活!
代码の冷笑话:
PM内心OS:“禁用App?不就是把它的ApplicationInfo
里的enabled
标成false
嘛,比把大象装冰箱还简单!”
3. 实战翻车现场:Bug们的狂欢
案例代码:
java
复制
// 当禁止列表为空时,竟把之前禁用的App再禁一遍?程序员:我杀我自己? if (packageNames == null || packageNames.isEmpty()) { String oldList = Settings.System.getString("DisallowedRunningApp"); for (String pkg : oldList.split(",")) { pm.setApplicationEnabledSetting(pkg, COMPONENT_ENABLED_STATE_DISABLED, 0); // 禁止→禁止→禁止禁止套娃! } Settings.System.putString("DisallowedRunningApp", ""); // 清空名单,假装无事发生 }
程序员调试日记:
-
Day1: “为什么点了‘允许所有’后,App消失得更彻底了?”
-
Day2: “PM愤怒地抛出了SecurityException——原来我忘了申请
CHANGE_COMPONENT_ENABLED_STATE
权限!” -
Day3: “用户反馈:禁用‘计算器’后,系统设置里的‘存储’选项闪退了…(因为系统设置偷偷调用了计算器?黑人问号.jpg)”
4. 终极优化:让Bug无处遁形
修复逻辑の奥义:
-
“允许所有”的正确姿势: 先遍历旧名单启用App,再清空名单,拒绝套娃!
-
权限要到位: 在
AndroidManifest.xml
里大喊一声:<uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" />
-
防御式编程: 包名不存在?
try-catch
护体!多用户环境?userId
传参安排!
最终代码の高光时刻:
java
复制
// 当允许所有App时:先捞旧名单,挨个解封,再清空名单! if (packageNames.isEmpty()) { String oldList = Settings.System.getString("DisallowedRunningApp"); for (String pkg : oldList.split(",")) { pm.setApplicationEnabledSetting(pkg, COMPONENT_ENABLED_STATE_ENABLED, 0); // 这才是“解封咒语”! } Settings.System.putString("DisallowedRunningApp", ""); // 名单清零,深藏功与名 }
5. 结语:App管理の哲学
PackageManager的魔法虽强,但切记:
“能力越大,责任越大!”
——别让系统设置里的App列表,变成“阿兹卡班监狱”的名单!
转载请注明出处“让App玩捉迷藏:Android教育平板的‘隐身术’开发实录”-CSDN博客,谢谢!