BroadcastReceiver для CONNECTIVITY_ACTION всегда возвращает значение null в intent.getExtras () - PullRequest
10 голосов
/ 03 августа 2011


Я пытаюсь получить 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));

            }
        }

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

Ответы [ 2 ]

16 голосов
/ 03 августа 2011

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

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

4 голосов
/ 10 ноября 2015

Ответ Дхармендраса это хорошо.Тем не менее, обратите внимание, что EXTRA_NETWORK_INFO теперь устарела (начиная с уровня API 14) и документы Android говорят следующее:

Поскольку NetworkInfo может различаться в зависимости от UID, приложения всегда должны получать информацию о сети через * 1007.*.

Это действительно облегчает нам задачу.Вы можете повторно использовать проверку подключения, которую вы, вероятно, делали раньше, и сделать что-то вроде этого:

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
    }
}

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

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

...