sendBroadcast与sendStickyBroadcast的区别

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对象只有在重启手机的情况下才会被销毁或者当内存不足,系统自动销毁。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值