android 静态和动态设置 Receiver的 android:enabled值
0x 01 前提约束:
0x001
静态检查:指用action限定Intent,并使用包管理器的queryBroadCastReceivers方法,在flags字段置为0时查找ResolveInfo,检查结果是指它有没有找到组件。
0x002
动态检查:指在指定 包名&类全路径名构成的ComponentName后,调用包管理器的getComponentEnabledSetting方法,得到它的状态值,注意它是一个Int类型,可能取值及意义如下所列。
0x003
动态修改:指在指定 包名&类全路径名构成的ComponentName后,调用包管理器的setComponentEnabledSetting方法,传入下面的三个值中的任意一个,设置enabled字段。
0x004
PackageManager.COMPONENT_ENABLED_STATE_DEFAULT
Int 值为0 ,指在manifest中没有显示声明
PackageManager.COMPONENT_ENABLED_STATE_ENABLED
Int 值为1 ,指在manifest中声明为 android:enabled=”true”
PackageManager.COMPONENT_ENABLED_STATE_DISABLED
Int 值为2 ,指在manifest中声明为 android:enabled=”false”
0x02 Demo 结果总结:
0x001 使用静态方式,修改不了enabled字段的值。
0x002 无论在manifest中被声明为true|false|默认,其对应动态检查结果都是0(还未动态改)。
0x003 对应在manifest中显示声明为 android:enabled=”true”时,无论动态修改值(0|1|2),使用静态检查时都是返回true;当动态修改它的值为2时,收不到广播,(0|1)时能收到。
0x004 对应在manifest中显示声明为 android:enabled=”false”时,如果程序动态将它的值修改成1时,使用静态检查可以找到组件,且其值仍然为false,但是可以收到广播,其它值(0|2)时,找不到对应组件,也收不到广播。
0x005 对应在manifest中没有显示声明时,则,动态修改它的值为2时,静态检查找不到对应组件,也收不到广播,其它值(0|1)时,静态检查值为true且能收到广播。
0x03 预备实现:
0x001
在sdk 中生成优先级时,对于检查push必须的Receivers:
先静态检查,看能否找到对应的组件,如果没有找到组件(包括根本就没有声明Receiver时,注意是没有找到组件,并不是“找到组件,只是值为false”),则直接返回优先级为0,否则默认检查通过,按照优先级生成算法生成优先级。
0x002
一种 case:一开始时在manifest中配置成android:enabled=”false”, 然后在将来的某个时刻尝试启用这个组件,即使得它可以收到广播。由以上结果知,如果不动态修改它的值,那么默认为0,静态检查是找不到这个组件,从而该广播也不能正常被使用。所以,在启用时,执行:动态将其值改为1,然后在重新调用startWork时进行新的一轮静态检查,这是发现它是通过的,所以可以生成优先级。
0x003
如果想关闭一个集成百度push的app,只要使得它的优先级降为0,可以发现:如果动态的将它们的值设置为2,然后再调用starWork进行新一轮静态检查时,将会发现找不到,从而将优先级置为0。
|
静态设置 |
动态设置 |
预期状态 |
静态值 |
可找到组件 |
可收到广播 |
|
没显示声明 |
无 |
True |
True |
True |
True |
|
DEFAULT |
True |
True |
True |
True |
|
|
ENABLED |
True |
True |
True |
True |
|
|
DISABLED |
False |
True |
False |
False |
|
|
True |
无 |
True |
True |
True |
True |
|
DEFAULT |
True |
True |
True |
True |
|
|
ENABLED |
True |
True |
True |
True |
|
|
DISABLED |
False |
False |
False |
False |
|
|
False |
无 |
False |
—— |
False |
False |
|
DEFAULT |
False |
—— |
False |
False |
|
|
ENABLED |
True |
False |
True |
True |
|
|
DISABLED |
False |
—— |
False |
False |
|
|
没有注册 |
—— |
False |
False |
False |
False |
从上面的表中可以得到,不论是哪种分类,只要动态将其置为ENABDLED,则静态检查都可以收到,同时也可以收到广播,但是,如果将其动态置为DISABLED,则几种情况下静态都检测不到组件。所以得在调用startWork时,只做静态检查(检查能否找到组件,而不是它的activityInfo.enabled字段的值是true还是false)。
0x04 注:测试中发现
0x001
在动态修改了组件的DISABLED/ENABDLED状态时,当应用退出或者重启后,这个动态修改的结果是持久的。
0x002
如果机子没有卸载,只是重装,则这些DISABLED/ENABDLED并不会被新安装的覆盖。
android 静态和动态设置 Receiver的 android:enabled值的更多相关文章
- 【Android】TextView动态设置android:drawableLeft|Right|Top|Bottom,SetColor
Android中有时需动态设置控件四周的drawble图片,这个时候就需要调用 setCompoundDrawables(left, top, right, bottom),四个参数类型都是drawa ...
- 3D touch 静态、动态设置及进入APP的跳转方式
申明Quick Action有两种方式:静态和动态 静态是在info.plist文件中申明,动态则是在代码中注册,系统支持两者同时存在. -系统限制每个app最多显示4个快捷图标,包括静态和动态 静态 ...
- iOS App3D Touch快捷键的静态以及动态设置详细使用
1. 功能支持 3D-Touch 只在 iOS 9 及以上版本得到支持,之前版本的 iOS 并不支持该功能:3D-Touch 只在 iPhone 6s 及以后型号的 iPhone 或 iPad Pro ...
- Android代码中动态设置图片的大小(自动缩放),位置
项目中需要用到在代码中动态调整图片的位置和设置图片大小,能自动缩放图片,用ImageView控件,具体做法如下: 1.布局文件 <RelativeLayout xmlns:android=&qu ...
- android自定义控件,动态设置Button的样式
原文 http://www.cnblogs.com/landptf/p/4562203.html 今天来看一个通过重写Button来动态实现一些效果,如圆角矩形.圆形.按下改变字体,改变背景色,改变 ...
- Android 软件盘 动态设置 layout
总体来说分为三种方法: 在编辑框输入内容时会弹出软键盘,而手机屏幕区域有限往往会遮住输入界面,我们先看一下问题效果图: 输入用户名和密码时,系统会弹出键盘,造成系统键盘会挡住文本框的问题,如图所示: ...
- Android开发之动态设置字体的样式和粗细
字体设置通常有两种形式: 1:在xml中直接设置 android:textStyle="bold" android:typeface="sans" 2:用jav ...
- layui 时间插件laydate中动态设置改变min和max值
<div class="layui-inline"> <label class="layui-form-label">申请时间</ ...
- Ext.form.Label组件动态设置html值
解决方法: (1)用的是 Ext.getCmp(id).setText('XXXX')可以动态设置label 显示的文本值,但是文本中有个别数字需要改变颜色显示,需要加样式,这种方法会把加样式的标签( ...
随机推荐
- Java的Hashtable类(转)
文章来源:http://blog.csdn.net/zhna123_2011/article/details/6741479 ps:直接copy 哈希表是一种重要的存储方式,也是一种常见的检索方法.其 ...
- Java中byte与(16进制)字符串的互相转换
java中byte用二进制表示占用8位,而我们知道16进制的每个字符需要用4位二进制位来表示,所以我们就可以把每个byte转换成两个相应的16进制字符,即把byte的高4位和低4位分别转换成相应的16 ...
- 模板—数学—Exgcd
模板—数学—Exgcd Code: #include <cstdio> #include <algorithm> using namespace std; int ex_gcd ...
- 训练指南 UVALive - 5713(最小生成树 + 次小生成树)
layout: post title: 训练指南 UVALive - 5713(最小生成树 + 次小生成树) author: "luowentaoaa" catalog: true ...
- Visual Studio 2017 编译Clang
到http://releases.llvm.org/download.html下载LLVM和clang源码 比如: http://releases.llvm.org/6.0.0/llvm-6.0.0. ...
- mysql 获取当前日期及格式化(转)
MySQL 获取当前日期及日期格式 获取系统日期: NOW() 格式化日期: DATE_FORMAT(date, format) 注: date:时间字段,format:日期格式 select now ...
- [BZOJ1146][CTSC2008]网络管理Network(二分+树链剖分+线段树套平衡树)
题意:树上单点修改,询问链上k大值. 思路: 1.DFS序+树状数组套主席树 首先按照套路,关于k大值的问题,肯定要上主席树,每个点维护一棵权值线段树记录它到根的信息. 关于询问,就是Que(u)+Q ...
- AGC 025 B - RGB Coloring
B - RGB Coloring Time limit : 2sec / Memory limit : 1024MB Score : 700 points Problem Statement Taka ...
- 【离散化】【扫描线】CH Round #59 - OrzCC杯NOIP模拟赛day1 队爷的新书
//上图绿色扫描线右侧少画了一条扫描线. 很多区间把数轴分成了很多段,看哪个点的(区间覆盖数*该点权值)最大. 显然在某个区间的右端点的答案是最优的. 排序后 用扫描线从左到右扫描,维护每个点的覆盖数 ...
- 安装virtualenvwrapper
理解:virtualenv 和 virtualenvwrapper 是两种东西,前者可以单独使用,后者是管理前者的工具,尤其是当有多个 virtualenv(隔离环境时).所以下面的配置都是在为了使用 ...