在我的onresume()活动中,我有这个
IntentFilter IntentFilter=新的IntentFilter();intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);registerReceiver(mReceiver,intentFilter);
每次onResume()激活时,mReceiver总是接收到一个广播,并具有ConnectivityManager的操作。CONNECTIVITY_action
这很奇怪,因为我的网络状态是在一个稳定的wifi中,根本没有改变。
每次onresume被激活时,registerReceiver都会被调用一次。registerReceiver发送bck粘性广播。一旦调用registerBroadcast,粘性广播就会发送到接收器。
您可以使用unregisterReceiver,或者检查您是否已经注册并跳过(如果是)。。
根据registerReceiver(BroadcastReceiver接收器,IntentFilter过滤器)的文档:
系统可能会广播"粘性"的Intent——这些Intent在广播结束后一直存在,并发送给任何后续注册。如果你的IntentFilter与其中一个粘性Intent匹配,该Intent将由该函数返回并发送到你的接收器,就像它刚刚被广播一样。
虽然你现在只是在注册你的接收器,但何时广播该意向取决于系统,因为该意向是一个粘性的意向,所以你一注册就会广播。
查看此ConnectivityManager.CONNECTIVITY_ACTION,是否在注册接收器时始终广播?
似乎粘性广播是操作ConnectivityManager.CONNECTIVITY_action的常见问题,按照我试图用XML描述接收器的说明进行操作,但这似乎不太好最后,我使用了一种灵活的方法来解决这个问题:由于Onresume中的每次都会发送该广播,所以我将布尔值设置为"false",当Onresume第一次调用接收器时,程序将什么也不做,只会将该布尔值设为"true"。然后,当连接发生变化时,它将进入正常过程。这似乎不是一个优雅的方法,但它在我的应用程序中起了作用。
解决方案是在BroadcastReceiver
的onReceive
回调中使用isInitialStickyBroadcast
,以了解您是否真的在进行粘性广播并采取相应行动(BroadcastReceiver:isInitialStickyBroad)