esh*_*yne 10 android disconnect broadcastreceiver wifi
我正在尝试使用BroadcastReceiver来检测手机何时从WiFi接入点断开连接.为此,我在清单中注册了我的BroadcastReceiver:
<receiver android:name="com.eshayne.android.WiFiBroadcastReceiver">
<intent-filter>
<action android:name="android.net.wifi.STATE_CHANGE" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
在我的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) {
...
}
Run Code Online (Sandbox Code Playgroud)
我看到的问题是,当手机离开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
Run Code Online (Sandbox Code Playgroud)
这也不是电话在WiFi范围内进出的问题,因为在"断开连接"的回调之间没有调用我的"连接"回调.任何其他国家也不会在其间被触发.只是一系列快速的6个回调,每个回调都有详细的DISCONNECTED状态.
有没有更好的方法来检测手机何时丢失了WiFi连接,以便每次断开连接只调用一次我的回叫?或者以任何方式检测我看到的6个回调中的哪一个是"最终"回调?
你说它是“6 个断开连接的回调的快速系列”,但你的 if/else-if 只检查 DISCONNECTED 和 CONNECTED,看起来没有默认块来处理所有其他情况。从NetworkInfo.DetailedState api 页面中,NetworkInfo.getDetailedState() 可以返回 10 种可能的状态,包括“正在连接”、“正在扫描”、“正在断开连接”,对于刚刚断开连接的手机来说,所有这些都是合理的行为来自网络。
放弃默认情况,提醒您wifi 状态的任何变化,而不仅仅是“已连接”和“已断开连接”。您可能会发现手机在几种不同的状态之间旋转,而不仅仅是向您发射同一个状态六次。希望从这里开始,如何继续编写代码将会更加清晰。
归档时间: |
|
查看次数: |
9338 次 |
最近记录: |