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 显示的文本值,但是文本中有个别数字需要改变颜色显示,需要加样式,这种方法会把加样式的标签( ...
随机推荐
- Servlet 2.3 规范
Servlet2.3规范 第一章: servlet2.3规范用到了一下的一些规范:J2EE.JSP1.1.JNDI 在14章中讲述了规范中的所有的classes类或接口(改文中不讲述).对开发者而言以 ...
- [CF441E]Valera and Number
题意:给定$x,k,p$和一份伪代码,伪代码大致是循环$k$次,每次有$p\%$的概率把$x$乘$2$,有$(100-p)\%$的概率把$x$加$1$,问最后在二进制下$x$的末尾期望$0$个数 鸽了 ...
- 【找规律】URAL - 2065 - Different Sums
就让0出现得尽可能多嘛……大概感受一下就是这样…… 0 0 ... 0 0 0 0 4 -4 3 -3 2 -2 1 -1 #include<cstdio> using namespace ...
- [USACO2015DEC]Max Flow
题目大意: 给你一棵n个点的树,有m次操作,每次将给定的路径上所有点的点权+1. 问最后最大的点权是多少. 思路: #include<cstdio> #include<cctype& ...
- 指定等级 Exercise07_01
import java.util.Scanner; /** * @author 冰樱梦 * 时间:2018年下半年 * 题目:指定等级 * */ public class Exercise07_01 ...
- 输入参数之POJO包装类
1,包装类:需要实现序列化 package com.songyan.pojo; import java.io.Serializable; public class QueryVo implements ...
- Asp.Net MVC part45 过滤器、模板页
过滤器 使用方式自定义类继承自相应的类或接口,重写方法,作为特性使用在控制器类中重写方法 特性方式的使用注意:如果继承自接口需要让类实现FilterAttribute,才可以作为特性使用使用方式1:作 ...
- IO多路复用 select、poll、epoll
什么是IO多路复用 在同一个线程里面, 通过拨开关的方式,来同时传输多个(socket)I/O流. 在英文中叫I/O multiplexing.这里面的 multiplexing 指的其实是在单个线程 ...
- cookie的secure、httponly属性设置
cookie的secure.httponly属性设置 转载自:http://www.cnblogs.com/alanzyy/archive/2011/10/14/2212484.html 一.属性说明 ...
- Maven多模块项目新建技巧-解决公共项目install之后可以在单独模块中直接编译
说明:如果按照这种方式http://www.cnblogs.com/EasonJim/p/8303878.html,且按照常规的install方式在子项目中编译项目,那么需要先install一下par ...