Действие BroadcastReceiver для подключения всегда возвращает значение null в intent.getExtras()


Im пытается получить BroadcastMessages от CONNECTIVITY_ACTION:

    // 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));

            }
        }

in short extras всегда имеет значение null. Я думал, что если я потеряю соединение WiFi, Я должен получить EXTRA_NO_CONNECTIVITY (потому что это единственный способ интернета) или, по крайней мере, что-то из списка. Но безуспешно. Если я отключу приемник WiFi AP, он получит свое сообщение, но с нулевыми дополнениями. Когда я снова включаю WiFi, приемник срабатывает, но без дополнительных услуг... Почему так? Как узнать, что приложение потеряло сетевое соединение? Я думал, так будет лучше.

2 ответов


вы не можете получить дополнительные, но вы можете получить данные таким образом

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


Dharmendras ответ - это хорошо. Однако, обратите внимание, что 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
    }
}

предполагая, что вы находитесь внутри активности, которая зарегистрировала трансляцию, конечно.

Это также имеет дополнительное преимущество в соответствии с лучшими практиками только для прослушивания передачи подключения как можно короче,описанные здесь :)