在我的onresume()活动中,我有这个
IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); registerReceiver(mReceiver,intentFilter);
每次onResume()激活时, mReceiver 始终收到广播,其动作为 ConnectivityManager.CONNECTIVITY_ACTION
这很奇怪,因为我的网络状态处于稳定的wifi状态,并且根本没有改变。
答案 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)