10


CONNECTIVITY_ACTION から BroadcastMessages を受信しようとしています:

    // register BroadcastReceiver on network state changes
    final IntentFilter mIFNetwork = new IntentFilter();
    mIFNetwork.addAction(android.net.ConnectivityManager.CONNECTIVITY_ACTION); //"android.net.conn.CONNECTIVITY_CHANGE"
    registerReceiver(mIRNetwork, mIFNetwork);

受信者は次のとおりです。

private BroadcastReceiver mIRNetwork = new BroadcastReceiver() {
    @Override
    public void onReceive(final Context context, final Intent intent) {

        android.util.Log.i(TAG,"mIRNetwork: Network State Received: "+intent.getAction());
        Bundle extras = intent.getExtras();
        if (extras!=null){
                android.util.Log.i(TAG,"mIRNetwork: ACTION_BACKGROUND_DATA_SETTING_CHANGED: "+extras.getString(ConnectivityManager.ACTION_BACKGROUND_DATA_SETTING_CHANGED));
                android.util.Log.i(TAG,"mIRNetwork: CONNECTIVITY_ACTION: "+extras.getString(ConnectivityManager.CONNECTIVITY_ACTION));
                android.util.Log.i(TAG,"mIRNetwork: EXTRA_EXTRA_INFO: "+extras.getString(ConnectivityManager.EXTRA_EXTRA_INFO));
                android.util.Log.i(TAG,"mIRNetwork: EXTRA_NO_CONNECTIVITY: "+extras.getString(ConnectivityManager.EXTRA_NO_CONNECTIVITY));
                android.util.Log.i(TAG,"mIRNetwork: EXTRA_REASON: "+extras.getString(ConnectivityManager.EXTRA_REASON));

            }
        }

つまり、extras は常に null です。WiFi接続が失われた場合、EXTRA_NO_CONNECTIVITY(インターネットへの唯一の方法であるため)または少なくともリストから何かを取得する必要があると思いました。しかし、運がありません。切断すると、WiFi AP レシーバーは彼のメッセージを受け取りますが、余分なものはありません。WiFi をもう一度オンにすると、受信機が起動しますが、追加機能はありません...なぜですか? アプリがネットワーク接続を失ったことを知る方法は? その通りだと思いました。

4

2 に答える 2

16

余分に取得することはできませんが、この方法でデータを取得できます

private class ConnectivityBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager
                .EXTRA_NO_CONNECTIVITY, false);
        NetworkInfo info1 = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager
                .EXTRA_NETWORK_INFO);
        NetworkInfo info2 = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager
                .EXTRA_OTHER_NETWORK_INFO);
        String reason = intent.getStringExtra(ConnectivityManager.EXTRA_REASON);
        boolean failOver = intent.getBooleanExtra(ConnectivityManager.EXTRA_IS_FAILOVER, false);
        Log.d("MY_TAG", "onReceive(): mNetworkInfo=" + info1 + " mOtherNetworkInfo = " +
                (info2 == null ? "[none]" : info2 + " noConn=" + noConnectivity));
    }
}

詳細については、これを参照してください

http://code.google.com/p/androidwisprclient/source/browse/trunk/src/com/joan/pruebas/NetworkConnectivityListener.java?r=2

于 2011-08-03T09:18:33.250 に答える
5

ダルメンドラの答えは良いです。ただし、EXTRA_NETWORK_INFO現在は非推奨であり (Api レベル 14 以降)、Android ドキュメントには次のように記載されていることに注意してください。

NetworkInfo は UID に基づいて変化する可能性があるため、アプリケーションは常に を通じてネットワーク情報を取得する必要がありますgetActiveNetworkInfo()

それは実際に私たちにとって物事を非常に簡単にします. おそらく以前に行った接続チェックを再利用して、次のようなことを行うことができます。

private class ConnectivityBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        unregisterReceiver(this)
        checkConnection();
    }
}

private void checkConnection() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
    if (cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo()
            .isConnectedOrConnecting()) {
        // do something
    }
}

もちろん、ブロードキャストを登録したアクティビティの中にいると仮定します。

これには、ここで概説されているように、接続ブロードキャストをできるだけ短時間だけリッスンするためのベスト プラクティスに従うという追加の利点もあります:)

于 2015-11-10T16:54:25.867 に答える