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并不会被新安装的覆盖。

时间: 2024-10-23 06:40:50

android 静态和动态设置 Receiver的 android:enabled值的相关文章

android 用java动态设置布局(增添删除修改布局)

XML对开发者来说十分的方便,不仅使用起来简单,而且能够及时调试,修改界面之后马上能看到效果. Java设置布局不具有这个优势.但是java却可以动态对布局进行操作,这是xml所做不到的.笔者认为,新手索要掌握的java动态设置布局主要有两点,一方面是对布局的属性进行修改,另一方面是增添和删除控件. 首先说一下动态设置布局在项目中的应用,拿高德地图举个例子,如下图:    我们可以看到,高德地图的默认界面与点击地图之后的界面是不一样的,上面同样的控件在layout中的位置也不一样,这个用xml便

android自定义控件,动态设置Button的样式

今天来看一个通过重写Button来动态实现一些效果,如圆角矩形.圆形.按下改变字体,改变背景色,改变背景图等 在此说明一下,这种实现方式绝对不是唯一的,而且通过xml文件即可简单实现,这样做只是为了将控件的样式完全由代码实现,更方便打包应用于其他项目 下面来看几张效果图:   图1 初始状态                                            图2 按下第一行的TEXT0    图3 按下第二行的TEXT1                         图4

Android代码中动态设置图片的大小(自动缩放),位置

项目中需要用到在代码中动态调整图片的位置和设置图片大小,能自动缩放图片,用ImageView控件,具体做法如下: 1.布局文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"

【Android基础】动态设置颜色值的方法

在Android里我们通常都是在Xml里设置字体或者图片等等的颜色值,但是有些时候我们要用到动态的设置颜色值(说白了就是在代码里设置颜色值),这个时候可能有些朋友不太清除这方面,所以我总结了以下两个方式(暂时): 1.通过Color这个API获取RGB颜色值,例: tvContent.setTextColor(Color.parseColor("#969696")); 2.通过getResources函数获取到Resources,接着用getColor方法获取对应的color文件下的颜

Android开发之动态设置字体的样式和粗细

字体设置通常有两种形式: 1:在xml中直接设置 android:textStyle="bold" android:typeface="sans" 2:用java代码的形式设置 在Android SDK中使用Typeface类来定义字体,可以通过常用字体类型名称进行设置,如设置斜体: TextView quehuo = (TextView)findViewById(R.id.quehuo);//为TextView显示的字体设置样式 quehuo.setTypefac

[Android] 代码中动态设置shape

TextView textView = new TextView(this); GradientDrawable drawable = new GradientDrawable(); drawable.setCornerRadius(5); drawable.setStroke(1, Color.parseColor("#cccccc")); drawable.setColor(Color.parseColor("#eeeeee")); textView.setBa

Android 动态设置margin

android的view中有setPadding,但是没有直接的setMargin方法.如果要在代码中设置该怎么做呢? 可以通过设置view里面的 LayoutParams 设置,而这个LayoutParams是根据该view在不同的GroupView而不同的. 布局文件如下: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://sc

Android中BroadcastReceiver的两种注册方式(静态和动态)详解

今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来接收来自系统和应用中的广播.在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能:当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作:当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户

如何在Android中为TextView动态设置drawableLeft等

如何在Android中为TextView动态设置drawableLeft等 两种方式: 方式1:手动设置固有边界 1 Drawable drawable = getResources().getDrawable(resId); 2 //注意查看方法TextView.setCompoundDrawables(Drawable, Drawable, Drawable, Drawable) 3 //的注释,要求设置的drawable必须已经通过Drawable.setBounds方法设置过边界参数 4