1

数日前、ブロードキャスト レシーバーを使用してデバイスの接続がいつ変更されるかを知るためのコードを Stackoverflow の投稿で見つけました。私はそれを自分のアプリケーションに適応させて動作しましたが、インターネット接続をオン/オフするたびに、レシーバーの onReceive メソッドが 2 回呼び出されます。何故ですか?とにかく、私のアプリケーションは正常に動作しますが、1 回で十分な場合に 2 回実行するアクションがあります。

これは私の受信機です:

public class ConnectivityReceiver extends BroadcastReceiver {

    private Context mContext;

    Thread network_check = new Thread(new Runnable(){
        public void run() {
            if (NetworkHelper.isOnline(mContext)) {
                     // Do some stuff
            }
        }
    });

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("MonitorInternetConnectivity", "onReceive");
        mContext = context;
        network_check.start();
    }
}

ネットワーク ヘルパー クラス:

public class NetworkHelper {

    public static boolean isOnline(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = cm.getActiveNetworkInfo();
        if (netInfo != null && netInfo.isConnectedOrConnecting() && canHit()) {
            return true;
        }
        return false;
    }

    public static boolean canHit() {
        try {
            URL url = new URL("http://www.google.com/");
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setConnectTimeout(3000);
            urlConnection.connect();
            urlConnection.disconnect();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } 
    }
}

そして、これをマニフェスト (および必要なアクセス許可) に追加しました。

<receiver android:name=".receivers.ConnectivityReceiver" android:exported="false">
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
        </intent-filter>
</receiver>

接続が変更されるたびに、ログに「onReceive」が 2 回表示されます。なんで?

ありがとう!

- - - - - - - - 編集 - - - - - - - - - - -

受信したインテントに関する情報を追加します。接続が変更されるたびに、受信した 2 つのインテントはまったく同じです。

デバイスがオフラインになると:

Intent { act=android.net.conn.CONNECTIVITY_CHANGE flg=0x10000010 cmp=com.pfc.app/.receivers.ConnectivityReceiver (has extras) }
Extras:
    NetworkInfo: type: WIFI[], state: DISCONNECTED/DISCONNECTED, reason: (unspecified), extra: (none), roaming: false, failover: false, isAvailable: false
    noConnectivity: true
    inetCondition: 0

デバイスがオンラインになると:

Intent { act=android.net.conn.CONNECTIVITY_CHANGE flg=0x10000010 cmp=pfc.dani.palou/.receivers.ConnectivityReceiver (has extras) }
Extras:
    NetworkInfo: type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: (none), roaming: false, failover: false, isAvailable: true
    inetCondition: 0
4

0 に答える 0