getBoolean (EXTRA_NO_CONNECTIVITY) всегда возвращает false - PullRequest
5 голосов
/ 30 августа 2011

Однажды, когда у меня возникла проблема, вы, ребята, были очень полезны. И вот я снова с другой проблемой, на которую я упал ...: /

Я использую пользовательский NetworkReceiver, который расширяет BroadcastReceiver. Я хочу определить, когда телефон подключен к Интернету, чтобы я мог запускать службу в любое время. Я прочитал много тем, и все темы более или менее подсказывают следующий код, который НЕ РАБОТАЕТ для меня:

public class NetworkReceiver extends BroadcastReceiver {

private static final String tag = NetworkReceiver.class.getSimpleName();

@Override
public void onReceive(Context context, Intent intent) {
    Log.i(tag,"****** NetworkReceiver // onReceive()");

    boolean noConnection = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);

    if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
        Log.i(tag,"****** NetworkReceiver // Network Down?: " + intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false));
    }

    // TODO Bug: Never stops the service. Stays always connected!
    if(noConnection) {
        Log.i(tag,"****** NetworkReceiver // Stopping Service...");
        context.stopService(new Intent(context, FetchService.class));
    } else {
        Log.i(tag,"****** NetworkReceiver // Starting Service!");
        context.startService(new Intent(context, FetchService.class));
    }
}

У меня проблема в том, что logcat всегда возвращает NetworkDown?: false, и служба никогда не останавливается (она перезапускается все время). Я попробовал это на эмуляторе, нажав F8, и я также попробовал это на своем dev-телефоне (у него нет SIM-карты, доступ в интернет через мой Wi-Fi роутер), выключив роутер -> доступ в интернет не гарантирован!

Мой манифест включает следующие строки:

* * 1010

Я должен также отметить, что я также пытался <action android:name="android.net.ConnectivityManager.CONNECTIVITY_ACTION" /> в моем файле манифеста без изменений, и это, когда я изменил строку: intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false) в intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, true) результат всегда был правдивым - и поэтому он всегда пытался остановить мой сервис и никогда не запускать его.

Я подозреваю, что Дополнения из Намерения вообще не читаются, и поэтому всегда возвращается значение по умолчанию getBooleanExtra().

PS. Я на Android 2.1

Спасибо!

Ответы [ 2 ]

3 голосов
/ 30 августа 2011

Я не уверен в том, что Дополнения не могут быть прочитаны внутри BroadcastReceiver, но я могу показать вам, как я использую BroadcastReceiver для целей, аналогичных вашей.

Мой приемник распознает только изменения подключения, но НЕ оценивает состояние подключения. Вместо этого он сообщает Service, так как в обоих случаях (подключен или нет) эта служба будет чем-то заниматься. Эта служба может быть запущена или не работать в это время, поэтому она будет либо запущена, либо «проинформирована» (помните, что вы можете безопасно вызывать startService () несколько раз , эти вызовы не вложены):

public class ConnectivityReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        final Intent intentService = new Intent(context, MyService.class);
        intentService.putExtra(MyService.INTENT_HANDLE_CONNECTIVITY_CHANGE, "");

        context.startService(intentService);
    }
}

Затем в моем сервисе я оцениваю связь и затем действую соответствующим образом. Обратите внимание, что я не оцениваю состояние подключения так же, как вы, и это может быть причиной того, что приведенный ниже код работает, но не ваш (ниже приведен только соответствующий код):

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    if (intent != null) {
        final Bundle bundle = intent.getExtras();

        // Handle the intent INTENT_HANDLE_CONNECTIVITY_CHANGEif any
        if ((bundle != null) && (bundle.get(INTENT_HANDLE_CONNECTIVITY_CHANGE) != null)) {         
            handleConnectivity(); 
        }
    }

    return START_STICKY;
}

private void handleConnectivity() {
    final ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    final NetworkInfo netInfo = cm.getActiveNetworkInfo();

    if(netInfo != null && netInfo.isConnected()) {
        // WE ARE CONNECTED: DO SOMETHING
    }   
    else {
        // WE ARE NOT: DO SOMETHING ELSE    
    }
}

Это прекрасно работает и под Android-7 (2.1).

2 голосов
/ 01 сентября 2011

Не знаю о странном флаге NO_CONNECTIVITY, но вы можете извлечь активную сеть из намерения:

(NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);

Возможно, вы просто можете вызвать isConnected () для этого объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...