sendBroadcast与sendStickyBroadcast的区别


前提条件:此处我主要讨论两种广播在代码中动态注册时的一些细节问题。

正常情况下,广播通常都是执行一次注册代码,就会触发各接收器接收一次,无论是在onCreate里注册还是onResume里注册:若在onCreate里注册,一般我们在onDestroy中进行注销;若在onResume里注册,一般我们在onPause里进行注销。

sendBroadcast为普通广播,若是动态注册的话:

只有先注册再发送广播,发送出来的intent才可以被接收器接收到,并执行接收器对象中的onReceive方法;若广播先发出来,再注册,广播先前发出来的intent是无法被接收器接收到的,也无法执行其onReceive方法。

sendStickyBroadcast广播,若是动态注册的话:

与sendBroadcast不同的是,sendStickyBroadcast无论是先注册再发送还是先发送再注册,发送出来的intent均可以被接收器接收到。当然你在使用sendStickyBroadcast广播时,首先需要在manifest.xml文件中配置此类型广播权限<uses-permissionandroid:name="android.permission.BROADCAST_STICKY"/>。

具体说明如下:

1、 在注册之前广播就发送出来了的intent会被缓存在内存中,待广播一旦注册该intent就会被接收器接收,并执行onReceive方法;

2、 若注册之后广播发送出来,触发接收器接收intent,接收器首先会去检索系统缓存中是否存在intent对象,若系统中不存在缓存的intent,广播intent发送过来时,系统会先将其保留到缓存中,接收器会接收当前的intent;若系统中已存在缓存的intent,则接收器首先会接收缓存中保存的intent,再接着接收当前发送过来的intent,即此时会执行两次广播接收器onReceive方法,为避免重复执行广播接收器,可以在onReceive方法中调用removeStickyBroadcast(intent)方法,将缓存中的intent移除。这样下次接收器检索不到缓存中的intent,就直接接收广播发送过来的intent;

3、 若当前广播为sendStickyBroadcast,然后代码中改为普通广播,这时缓存中保存的intent依然会被接收器接收,再接收当前发送过来的intent,效果和sendStickyBroadcast一样,哪怕清除应用本身的数据也还是如此,缓存中的intent对象依然存在。另一种现象是此时若先发送普通广播,再注册,此时普通广播的接收器虽然接收不到发送过来的广播,但可以接收到先前使用sendStickyBroadcast广播时缓存中的intent,当然这种奇异现象只会出现在调试代码的情况下,是不会出现在应用本身的执行过程中。该缓存中的intent对象只有在重启手机的情况下才会被销毁或者当内存不足,系统自动销毁。

4、 缓存中的intent对象对应不同的action,若通过sendStickyBroadcast发送广播设置不同的action值,将会在系统中分别对不同的action缓存不同的intent对象;即,若设置StickyBroadcast的action为A,则发送广播后会在系统中缓存一个对应的intentA对象,若设置StickyBroadcast的action为B,则发送广播后会在系统中缓存一个对应的intentB对象;这些缓存中的intent对象只有在重启手机的情况下才会被销毁或者当内存不足,系统自动销毁。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453496.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 线程池 初始大小_为什么tomcat的默认线程池大小如此之大? - java

我注意到默认的tomcat 7线程池大小似乎是200。但是普通的CPU似乎有16个内核。因此只能并行执行16个线程为什么tomcat使用那么多线程。参考方案多年以来&#xff0c;许多单核计算机问世&#xff0c;并且能够以“伪并行”模式运行功能&#xff0c;也就是说&#xff0c;您可能有16…

Hadoop2.6.0完全分布式安装

1、修改主机名称 对master/slave1/slave2同时配置为Master/Slave1/Slave2 masterMaster:~$ sudo gedit /etc/hostname 上述3个虚机结点均需要进行以上步骤 2、填写主机IP 对master/slave1/slave2同时配置 masterMaster:~$ sudo gedit /etc/hosts 192.168.48.128 master192.168.…

DEX加密效果分析

dex加密目的&#xff1a;保护安卓应用的Java源代码&#xff0c;避免被恶意分析&#xff0c;技术被窃取准备工具&#xff1a;1、apktool &#xff1a;反编译apk&#xff0c;提取smali代码2、dex2jar &#xff1a;将dex转化为jar文件3、jd-gui &#xff1a;查看jar文件&#xff0…

一些比特率值

比特率 比特率是指将数字声音由模拟格式转化成数字格式的采样率&#xff0c;采样率越高&#xff0c;还原后的音质就越好。 比特率值与现实音频对照&#xff1a; 16KBPS电话音质 24KBPS增加电话音质、短波广播、长波广播、欧洲制式中波广播40KBPS美国制式中波广播56KBPS话…

java asynccontext,超时后的JavaEE 6 AsyncContext行为

What is the exact behavior of AsyncContext after it times out? Does it still run and does it return response using getResponse()?解决方案Java Servlet 3.0 Maintenance Release on page 34 reads:A call to this method - ServletRequest.startAsync(ServletReques…

BZOJ1857:[SCOI2010]传送带——题解

http://www.lydsy.com/JudgeOnline/problem.php?id1857 Description 在一个2维平面上有两条传送带&#xff0c;每一条传送带可以看成是一条线段。两条传送带分别为线段AB和线段CD。lxhgww在AB上的移动速度为P&#xff0c;在CD上的移动速度为Q&#xff0c;在平面上的移动速度R。…

mnt/sdcard和storage/sdcard的区别

/mnt 目录&#xff0c;熟悉linux的人都清楚&#xff0c;linux默认挂载外部设备都会挂到这个目录下面去&#xff0c;如将sd卡挂载上去后&#xff0c;会生成一个/mnt/sdcard 目录。 storage/sdcard 目录&#xff0c;这是一个软链接&#xff08;相当于windows的文件夹的快捷方式&a…

kd树的原理

kd树就是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构&#xff0c;可以运用在k近邻法中&#xff0c;实现快速k近邻搜索。构造kd树相当于不断地用垂直于坐标轴的超平面将k维空间切分。    假设数据集\(T\)的大小是\(m*n\),即\(T{x_1,x_2,...x_m}\),其中…

应聘华为的朋友小心了,应聘华为的悲惨遭遇!

以下内容全部真实&#xff0c;为本人亲身经历。可随时进行当面对质。 本人女朋友&#xff0c;原本是西安一家企业里面的行政助理&#xff0c;工作比较稳定&#xff0c;收入不高&#xff0c;但也基本够她用了。 一天&#xff0c;我的一个同学&#xff08;华为员工&#xff09;说…

力软 java主从表保存_JAVA常用知识总结(十二)——数据库(二)

MySQL主从热备份工作原理简单的说&#xff1a;就是主服务器上执行过的sql语句会保存在binLog里面&#xff0c;别的从服务器把他同步过来&#xff0c;然后重复执行一遍&#xff0c;那么它们就能一直同步啦。整体上来说&#xff0c;复制有3个步骤&#xff1a;作为主服务器的Maste…

HttpClient和DefaultHttpClient

HttpClient 是接口&#xff0c;DefaultHttpClient是实现这个接口的子类 public interface HttpClient {/*** Obtains the parameters for this client.* These parameters will become defaults for all requests being* executed with this client, and for the parameters of…

Go语言版黑白棋

1、游戏说明2、无边框窗口实现3、背景图、最小化、关闭窗口4、界面其它设计5、黑白子提示闪烁效果6、落子7、初始化棋子、改变角色8、倒计时9、吃子10、棋子个数统计、胜负判断11、机器落子 转载于:https://www.cnblogs.com/tennysonsky/p/8442827.html

vue使用render渲染jsx

vue&jsx文档 vue实例属性 // App.ts import hBtn from ./components/hBtn import hUl from ./components/hUlexport default {data(){return {theme: "mdui-theme-pink",accent: "mdui-theme-accent-pink",users:[aoo, boo, coo]}},methods:{},render(…

java中的多线程有什么意义_Java多线程与并发面试题(小结)

1&#xff0c;什么是线程&#xff1f;线程是操作系统能够进行运算调度的最小单位&#xff0c;它被包含在进程之中&#xff0c;是进程中的实际运作单位。程序员可以通过它进行多处理器编程&#xff0c;你可以使用多线程对运算密集型任务提速。比如&#xff0c;如果一个线程完成一…

IT必须掌握的常用命令

一&#xff0c;ping      它是用来检查网络是否通畅或者网络连接速度的命令。作为一个生活在网络上的管理员或者黑客来说&#xff0c;ping命令是第一个必须掌握的DOS命令&#xff0c;它所利用的原理是这样的&#xff1a;网络上的机器都有唯一确定的IP地址&#xff0c;我们…

Callable类

&#xff08;一&#xff09; Callable和Runnable比较相似&#xff0c;都可以用来实现线程任务。但callable使用了泛型设计&#xff0c;使用一个V类型值&#xff0c;能够 在执行结束后返回一个V类型的值。而Runable只会返回一个void&#xff0c;不能够获得执行的结果。 &#x…

Java——线程的创建,线程池

线程 多线程就是一个程序中有多个线程在同时执行。 多线程下CPU的工作原理 实际上&#xff0c;CPU(中央处理器)使用抢占式调度模式在多个线程间进行着高速的切换。对于CPU的一个核而言&#xff0c;某个时刻&#xff0c;只能执行一个线程&#xff0c;而CPU的在多个线程间切换速度…

初级第一旬05— 蓝字观试题

准提法网络佛学院 准提法教学平台 一、高七师提倡初学准提法者&#xff0c;应先观蓝字&#xff0c;在《显密圆通成佛心要集》中有依据吗&#xff1f; 二、正修的时候&#xff0c;如果不得不中断怎么办&#xff1f; 三、蓝字观有几种手印&#xff1f;可以单独使用吗&#xff1f;…

java并查集找朋友圈_图—并查集(解决朋友圈问题)

图也是一种 非线性结构&#xff0c;是由多个顶点组成的关系集合组成的一种数据结构。图可以分为两种&#xff0c;无向图和有向图。★图的定义:★典型问题&#xff1a;利用图能够解决很多问题&#xff0c;这里有一个较为典型的问题&#xff0c;假如已知有n个人和m对好友关系(存于…

技术这东西,不可不看,不可全看.

最近忙着玩开心,好久没来CSDN了,首页上有90后程序员的消息了,稍微感慨一下,曾几何时,自己这个80后还被70后的前辈所笑话,转眼就成了5年经验的老油条了.呵呵. 5年,个人认为经历还是有些代表性的,就跟刚入行或者即将入行的哥们交个底吧,这5年到底学到了什么. 如果你看完这篇文…