Android 关于ApplicationInfo flags快速了解

关于ApplicationInfo flags快速了解

  在Application中我们可以常常通过添加flags来标志一些属性和能力,比如android:protectionLevel="system"或android:protectionLevel="signatureOrSystem"就表示添加了FLAG_SYSTEM这个标志,表示属于系统级应用,当然,这个FLAG_SYSTEM依赖于签名检查或权限。

flag的判断和使用

  首先在Application中flages的默认值是0,而这些标志则用移位运算符号(<<) 表示。
  以flag:FLAG_TEST_ONLY为例子

  1. 对于int值 1 来说,他的二进制为00000000 00000000 00000000 00000001(32位),FLAG_TEST_ONLY= 1<<8; 相对于 将1向左移动8位即00000000 00000000 00000001 00000000 == 2的8次方 即256
  2. 如果此时我们的flags只添加了FLAG_DEBUGGABLE,那么此时flags这个标识的值为2 (二进制表示为00000000 00000000 00000000 00000010),当我们需要再去添加FLAG_TEST_ONLY标识时,其实是做了或位运算**,flags=flags|FLAG_TEST_ONLY**
  3. 或位运算运算过程即二进制下同一位上如果有1则赋1,如下
计算对象 第32位 第10位 第9位 第8位 第7位 第6位 第5位 第4位 第3位 第2位 第1位
flags 0 0 0 0 0 0 0 0 0 0 1 0
FLAG_TEST_ONLY 0 0 0 1 0 0 0 0 0 0 0 0
计算后flags 0 0 0 1 0 0 0 0 0 0 1 0

  所以flags的最后结果就是00000000 00000000 00000001 00000010 即 258,这时可能会有同学好奇为什么不直接加起来,这样结果不是一样的吗?这时其实就要考虑一种情况,我的flags如果在代码中添加的这个flag(比如FLAG_TEST_ONLY)之前已经添加过了,就会重复计算,那么这时我们的结果就会出现问题,所以或位是目前较为好的选择。
  简单来说,你可以把每一位想成一个flag,如果你添加了此flag那么这个二进制位上的值肯定是1,如果没有就是0,其中首位是符号位,这样的好处就是不用通过设置大量的bool变量来标识是否开启。

    /**
     * Value for {@link #flags}: set to true if this application would like to
     * allow debugging of its
     * code, even when installed on a non-development system.  Comes
     * from {@link android.R.styleable#AndroidManifestApplication_debuggable
     * android:debuggable} of the &lt;application&gt; tag.
     */
    public static final int
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值