为什么接收器每次激活onResume()方法时都会收到广播?

时间:2013-11-20 03:45:02

标签: android broadcast onresume

在我的onresume()活动中,我有这个

  

IntentFilter intentFilter = new IntentFilter();   intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);   registerReceiver(mReceiver,intentFilter);

每次onResume()激活时, mReceiver 始终收到广播,其动作为 ConnectivityManager.CONNECTIVITY_ACTION

这很奇怪,因为我的网络状态处于稳定的wifi状态,并且根本没有改变。

4 个答案:

答案 0 :(得分:2)

每次激活onresume时,每次再调用一次registerReceiver。 registerReceiver发送bck 粘性广播。一旦调用registerBroadcast,便会将粘性广播发送到接收器。

你可以使用 unregisterReceiver 或检查你是否必须检查你是否已经注册并跳过,如果是的话。

答案 1 :(得分:1)

根据registerReceiver(BroadcastReceiver接收器,IntentFilter过滤器)的文档:

  

系统可以广播“粘性”的意图 - 这些意图在广播结束后保持不变,以便发送到任何以后的注册。如果您的IntentFilter与其中一个粘性Intent匹配,那么Intent将由此函数返回并发送到您的接收器,就好像它刚刚被广播一样。

虽然你现在只是注册你的接收器,但是系统在何时广播那个Intent并且因为那个意图是一个粘性的,所以一旦你注册它就会被广播。

查看此ConnectivityManager.CONNECTIVITY_ACTION, always broadcast when registering a receiver?

答案 2 :(得分:0)

似乎粘性广播是操作ConnectivityManager.CONNECTIVITY_ACTION的常见问题, 按照我试图用XML描述接收器的指令,但似乎不太合适 最后,我使用了一种灵活的方法来解决这个问题:由于Onresume中的每次都会发送该广播,所以当onresume第一次调用接收器时,我将布尔值设置为'false',该程序除了将此布尔值设置为“true”之外什么都不做。 然后当CONNECTIVITY改变时,它将进入正常过程。 这似乎不是一个优雅的方法,但它在我的应用程序中工作。

答案 3 :(得分:0)

解决方案是在isInitialStickyBroadcast的{​​{1}}回调中使用onReceive来了解您是否正在进行粘性广播并采取相应行动(BroadcastReceiver : isInitialStickyBroadcast