1. ホーム

[解決済み】androidアプリでインターネット接続を確認するためのブロードキャストレシーバー

2022-04-04 09:32:06

質問

インターネット接続を確認するためのandroid放送受信機を開発しています。

問題は、私のブロードキャストレシーバーが2回呼び出されていることです。私はそれがネットワークが利用可能であるときだけ呼び出されるようにしたい。それが利用できない場合、私は通知したくない。

これはブロードキャストレシーバーです

public class NetworkChangeReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(final Context context, final Intent intent) {
        final ConnectivityManager connMgr = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);

        final android.net.NetworkInfo wifi = connMgr
                .getNetworkInfo(ConnectivityManager.TYPE_WIFI);

        final android.net.NetworkInfo mobile = connMgr
                .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

        if (wifi.isAvailable() || mobile.isAvailable()) {
            // Do something

            Log.d("Network Available ", "Flag No 1");
        }
    }
}

これは、manifest.xmlです。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.broadcastreceiverforinternetconnection"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <receiver android:name=".NetworkChangeReceiver" >
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

解決方法は?

最初の質問に対する回答 : 放送受信機が2回呼び出されている理由は

を2つ追加しています。 <intent-filter>

  1. ネットワーク接続の変更 :

    <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />

  2. WiFiの状態の変化。

    <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />

1つでいいんです。

<action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> .

2つのアクションに反応するのではなく、1つのアクションにしか反応しなくなります。参照 ここで をご覧ください。

2つ目の質問に対する回答 (インターネットに接続できる環境であれば、1回だけ電話をかけるようにしたい場合)。

あなたのコードは完璧です。インターネットが利用可能なときだけ通知します。

アップデイト

携帯電話がインターネットに接続されているかどうかを確認したい場合、この方法で接続を確認することができます。

public boolean isOnline(Context context) {

    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    //should check null because in airplane mode it will be null
    return (netInfo != null && netInfo.isConnected());
}