注:最近の最新の回答については、以下の回答を参照してください。
たくさんのグーグルとデバッグの後、これが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インスタンスを含む2つのインテント(getType()== TYPE_WIFIとisConnected()== trueの両方)が取得されます。この質問で説明されている問題です。
のみを使用するWifiManager.NETWORK_STATE_CHANGED_ACTION
場合、Wifiが切断されたときにブロードキャストされるインテントはありませんが、異なるNetworkInfoインスタンスを含む2つのインテントがあり、Wifiが接続されているときに1つのイベントを判別できます。
intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO)
注: nullが返された単一のクラッシュレポート(NPE)を受け取りました。したがって、発生することが非常にまれであるように思われる場合でも、nullチェックを追加することをお勧めします。
乾杯、トルステン