注意:有关最近的最新答案,请参阅下面的答案!
经过大量的谷歌搜索和调试,我相信这是确定 Wifi 是否连接或断开的正确方法。
onReceive()
BroadcastReceiver中的方法:
public void onReceive(final Context context, final Intent intent) {
if(intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
NetworkInfo networkInfo =
intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
if(networkInfo.isConnected()) {
// Wifi is connected
Log.d("Inetify", "Wifi is connected: " + String.valueOf(networkInfo));
}
} else if(intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
NetworkInfo networkInfo =
intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
if(networkInfo.getType() == ConnectivityManager.TYPE_WIFI &&
! networkInfo.isConnected()) {
// Wifi is disconnected
Log.d("Inetify", "Wifi is disconnected: " + String.valueOf(networkInfo));
}
}
}
连同 AndroidManifest.xml 中的以下接收器元素
<receiver android:name="ConnectivityActionReceiver"
android:enabled="true" android:label="ConnectivityActionReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
<action android:name="android.net.wifi.STATE_CHANGE"/>
</intent-filter>
</receiver>
一些解释:
仅考虑ConnectivityManager.CONNECTIVITY_ACTION
时,当 Wifi 连接时,我总是得到两个包含相同 NetworkInfo 实例(getType() == TYPE_WIFI 和 isConnected() == true)的意图 - 这个问题中描述的问题。
仅使用WifiManager.NETWORK_STATE_CHANGED_ACTION
时,Wifi 断开时不广播意图,而是包含不同 NetworkInfo 实例的两个意图,允许在 Wifi 连接时确定一个事件。
注意:我收到了一份intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO)
返回 null 的崩溃报告 (NPE)。因此,即使这种情况似乎极为罕见,添加空检查也是一个好主意。
干杯,托斯滕