利用PackageManager做一个禁用某个系统应用的功能

来源:互联网 发布:圣山 知乎 编辑:程序博客网 时间:2024/05/17 22:07

不积跬步无以至千里
一、需求
如果我们想要禁用掉一个系统应用,不想再让他本身被打开,并且不想让它被别的应用调起来(情景:例如浏览器,本身点图标,你不想打开此应用,而且你在qq里打开一个网址,会调用到浏览器,你也不想让他打开浏览器)。这时候就是我们要做的功能。我们这次以浏览器锁定为例,如图:
这里写图片描述
二、代码
可以看出我们是一个CheckBox,因此需要存值我们用到了Setting的provider对此功能的值的存取
代码如下:
其中Settings.java的路径为:android\frameworks\base\core\java\android\provider\Settings.java

这里写图片描述
这里写图片描述
这里是代码实现的地方:
这里写图片描述
set:
这里写图片描述
get:
这里写图片描述
通过get来获取目前浏览器锁定的状态,通过set用来当按钮改变时候来存储状态值,并去发送一个广播给Browser内的一个广播接受者,具体的逻辑在那里实现。(为什么要把这个逻辑放到Browser里面,小编测试过了,如果你在外部实现禁用会出现权限问题)
如图:
这是操作禁用代码:
这里写图片描述
为什么会提示权限问题的代码:(代码的路径为:frameworks/base/services/java/com/android/server/pm/PackageManagerService.java)
这里写图片描述
在这里,他是想让你在同一个app里操作这个应用的禁用,所以会根据你的uid,判断是不是一个app在做这个操作。
因此,可以看出,系统想让自身来管理自己(从Camera中的DisableCameraReceiver也可以看出),所以我们只能在浏览器的内部写一个广播接收者。
当然要先自定义一个广播接收者
这里写图片描述
因为我这里开机的时候也想把这个操作设置上,所以加上了开机广播(注意开机广播需要权限,不仅需要action)
然后通过匹配action做操作,可以看出先去获取不同的action,其中一个action就是咱们上边发送广播到浏览器这个广播接收者的,然后获取Settings的值。
接下来咱们看一下disableComponent这个方法代码如下:
这里写图片描述
禁止代码主要就是用的PackageManager的setCompentEnableSetting方法。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 婴儿天热出汗多尿少怎么办 婴儿5个月不主动抓东西怎么办 打疫苗吃了辣怎么办 四个月宝宝枕秃怎么办 四个月的孩子缺钙怎么办 小孩张牙齿会发烧怎么办 对节白蜡叶子干了怎么办 刷机字库坏了怎么办 魅蓝返回键失灵怎么办 牙蛀严重且牙根松动怎么办 蛀牙伤到神经了怎么办 给客户发错邮件怎么办外贸 cf没有枪声和脚步声怎么办 穿越火线fps太低怎么办 win10玩cf没有声音怎么办 儿子死了欠的钱怎么办 儿子欠银行的钱怎么办 惹了社会上的混混怎么办 我是五年级惹上混混怎么办 孩子挨欺负家长怎么办幼儿园 孩子被同学欺负不敢上学怎么办 孩子被欺负不敢还手怎么办 2个月的婴儿内热怎么办 孩子把别人打了怎么办 学生在学校被打怎么办 妈和老丈人搞外遇怎么办? 丈人住在双方出资房中怎么办 金木水火土缺水怎么办? 练太极注意不集中怎么办 白色裙子被染色了怎么办 两边的头发向外翘怎么办 感冒的前兆来了怎么办 压腿把筋拉伤了怎么办 压腿压不下去了怎么办 床的气压杆坏了怎么办 床打开压不下去怎么办 裤子大了怎么办小窍门 小孩不准守课堂纪律怎么办 学生在学校体育课受伤怎么办 手指被篮球砸肿了怎么办 眼睛被篮球砸了怎么办