我正在尝试使用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个回调中的哪一个是“最后一个”?