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

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

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