我正在尝试使用BroadcastReceiver来检测手机何时与WiFi接入点断开连接.为此,我在清单中注册了我的BroadcastReceiver:
<receiver android:name="com.eshayne.android.WiFiBroadcastReceiver"> <intent-filter> <action android:name="android.net.wifi.STATE_CHANGE" /> </intent-filter> </receiver>
在我的WiFiBroadcastReceiver类中,我正在检查一个NETWORK_STATE_CHANGED_ACTION操作,并查看NetworkInfo的详细状态:
if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) { NetworkInfo info = (NetworkInfo)intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); android.util.Log.d("com.eshayne.android.WiFiBroadcastReceiver","network state change - detailedState=" + info.getDetailedState() + ": " + info.toString()); if (info.getDetailedState() == DetailedState.DISCONNECTED) { ... } else if (info.getDetailedState() == DetailedState.CONNECTED) { ... }
我看到的问题是,当手机离开WiFi接入点的范围时,我的“断开连接”回调将被调用6次 – 在每次停止之前,每隔15秒定期关闭一次.到目前为止,我无法在每个回调的NetworkInfo之间找到任何区别的特征.正在写入日志的每个NetworkInfo对象如下所示:
02-18 10:16:51.918 D/com.eshayne.android.WiFiBroadcastReceiver( 1511): network state change - detailedState=DISCONNECTED: NetworkInfo: type: WIFI[],state: DISCONNECTED/DISCONNECTED,reason: (unspecified),extra: (none),roaming: false,failover: false,isAvailable: true
在WiFi范围内移动的手机也不是一个问题,因为在“断开连接”回调之间没有调用“连接”回调.任何其他国家之间也不会触发任何其他国家.只是一系列6个回调,每个回调都有一个DISCONNECTED的详细状态.
有没有更好的方法来检测手机何时丢失了WiFi连接,这样我的回调只能在断开连接时被调用一次?或者任何方式来检测我看到的6个回调中的哪一个是“最终的”?
解决方法
你说这是一个“6连接回调的快速系列”,但是如果/ else-if仅对DISCONNECTED和CONNECTED进行检查,那么看起来像没有默认的块来处理所有其他情况.从
NetworkInfo.DetailedState api页面,可以由NetworkInfo.getDetailedState()返回的10个可能的状态,包括“连接”,“扫描”,“断开连接”,所有这些状态对于刚刚从网络.
抛出一个默认情况,提醒您WiFi状态的任何更改,而不仅仅是“CONNECTED”和“DISCONNECTED”.你可能会发现手机在几种不同的状态之间转动,而不仅仅是在你六次的同时一个.希望从那里开始,你的代码如何进行会更清楚一些.