Намеренное действие для сетевых событий в android sdk

Мне нужно получать трансляции для сетевых действий, таких как подключение к сети, отключение и т. д. Для этой цели я использую широковещательный приемник. Может ли кто-нибудь сказать мне, какое намерение мне нужно захватить для сетевых событий, прямо сейчас, согласно моему поиску в Интернете, я использую android.net.ConnectivityManager.CONNECTIVITY_ACTION.

Вот мой класс широковещательного приемника:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class NetworkStateReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub


    if (intent.getAction().equals(
            android.net.ConnectivityManager.CONNECTIVITY_ACTION)) {

        // do something..
    }
}
}

и я также добавил разрешение на доступ к состоянию сети:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

вот как я объявил этот класс в файле манифеста

<receiver class=".NetworkStateReceiver" android:name=".NetworkStateReceiver">
    <intent-filter>
            <action android:name="android.net.ConnectivityManager.CONNECTIVITY_ACTION" />
    </intent-filter>
</receiver>

Пожалуйста, предложите мне правильное намерение, если я ошибаюсь ИЛИ если есть какой-либо другой способ поймать сетевые события.


person mudit    schedule 19.02.2010    source источник


Ответы (2)


Вот рабочий пример:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

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

.

public class ConnectivityReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(ConnectivityReceiver.class.getSimpleName(), "action: "
                + intent.getAction());
    }

}
person yanchenko    schedule 19.02.2010
comment
Согласно моему тесту, мне не нужно какое-либо разрешение для приема трансляций, независимо от того, работает ли сейчас wlan или 3g. Я немного запутался, для чего тогда нужен android.net.conn.CONNECTIVITY_CHANGE? - person stefan.at.wpf; 11.05.2011
comment
Если вы посмотрите еще раз, вы увидите, что CONNECTIVITY_CHANGE — это не разрешение, а регистрация получателя намерений (что вы также можете сделать в коде). - person Hamid; 12.04.2012
comment
Ответ выглядит так же, как вопрос. Так почему же это НЕ работало до ответа? - person AlikElzin-kilaka; 21.07.2012
comment
Этот ответ просто исправляет имя действия намерения в манифесте. значение android.net.ConnectivityManager.CONNECTIVITY_ACTION равно android.net.conn.CONNECTIVITY_CHANGE, и именно оно соответствует действию намерения. - person FabiF; 04.09.2012
comment
Этот код работает, но он только сообщает вам об изменении подключения. Есть ли способ определить, подключено оно или нет? - person Evan R.; 17.09.2012

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

public class ConnectivityReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(ConnectivityReceiver.class.getSimpleName(), "action: "
                + intent.getAction());
        MyConstants.IS_NETWORK_AVAILABLE = haveNetworkConnection(context);
        //IS_NETWORK_AVAILABLE this variable in your activities to check networkavailability.

    } 


    private boolean haveNetworkConnection(Context context) {
        boolean haveConnectedWifi = false;
        boolean haveConnectedMobile = false;

        ConnectivityManager cm = (ConnectivityManager)   context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo[] netInfo = cm.getAllNetworkInfo();
        for (NetworkInfo ni : netInfo) {
            if (ni.getTypeName().equalsIgnoreCase("WIFI"))
                if (ni.isConnected())
                    haveConnectedWifi = true;
            if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
                if (ni.isConnected())
                    haveConnectedMobile = true;
        }
        return haveConnectedWifi || haveConnectedMobile;    
    }
}
person Ravi K. Sharma    schedule 05.10.2012
comment
в Ravi K Sharma, знаете ли вы об android.net.ConnectivityManager.EXTRA_NO_CONNECTIVITY? Это дополнительное логическое значение в дополнениях Intent, начиная с уровня API 1, которое сообщает, есть ли подключение или нет. - person class stacker; 15.12.2012
comment
Что касается вчерашнего комментария, я заметил, что он не точен. Похоже, что EXTRA_NO_CONNECTIVITY, по крайней мере, при некоторых обстоятельствах, добавляется к дополнительным функциям Intent только в том случае, если нет возможности подключения. Таким образом, доступ к нему с помощью getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false) должен давать логическое значение, которое является истинным, если соединение вообще отсутствует, и ложным, если оно есть. Кроме того, код в этом ответе является анти-шаблоном, потому что анализ ограничен. Он не обнаружит Bluetooth-модем, USB-модем или подключение к локальной сети. Не делай этого. - person class stacker; 17.12.2012
comment
Атрибуция этого кода, поскольку Рави забыл об этом: stackoverflow.com/a/4239410/182653 - person paulw1128; 22.05.2013
comment
Почему бы просто не получить getActiveNetworkInfo() и не проверить, все ли с ним связано? - person Ε Г И І И О; 27.05.2013
comment
Да Ε Г И І И О, вы правы, если вам не нужно знать о типе соединения, к которому вы подключены. - person Ravi K. Sharma; 27.05.2013