Сетевой прослушиватель Android

Я хочу проверить, когда сеть телефона в Android отключается. Могу ли я запечатлеть это событие?

Я не получаю надлежащего API или какого-либо примера, который объяснял бы то же самое. Если бы кто-нибудь сделал или какие-либо ссылки на примеры были бы действительно полезны.


person Sam97305421562    schedule 23.11.2009    source источник


Ответы (4)


Новый класс Java:

public class ConnectionChangeReceiver extends BroadcastReceiver
{
  @Override
  public void onReceive( Context context, Intent intent )
  {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService( Context.CONNECTIVITY_SERVICE );
    NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
    NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo(     ConnectivityManager.TYPE_MOBILE );
    if ( activeNetInfo != null )
    {
      Toast.makeText( context, "Active Network Type : " + activeNetInfo.getTypeName(), Toast.LENGTH_SHORT ).show();
    }
    if( mobNetInfo != null )
    {
      Toast.makeText( context, "Mobile Network Type : " + mobNetInfo.getTypeName(), Toast.LENGTH_SHORT ).show();
    }
  }
}

Новый xml в вашем AndroidManifest.xml под элементом «манифест»:

<!-- Needed to check when the network connection changes -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

Новый xml в вашем AndroidManifest.xml под элементом «приложение»:

<receiver android:name="com.blackboard.androidtest.receiver.ConnectionChangeReceiver"
          android:label="NetworkConnection">
  <intent-filter>
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
  </intent-filter>
</receiver>
person Eric    schedule 23.11.2009
comment
как говорит @noillusioin, activeNetInfo может быть нулевым. Это указывает на то, что сетевое соединение ПРОСТО ОТКЛЮЧЕНО, если вы знаете (сохранить состояние), что ранее были подключены. - person larham1; 19.04.2013
comment
@ Эрик, есть ли альтернатива для getNetworkInfo ?? Потому что он устарел. - person MashukKhan; 26.09.2016
comment
@MashukKhan это ... буквально прямо в javadoc: этот метод устарел на уровне API 23. Этот метод не поддерживает несколько подключенных сетей одного типа. Вместо этого используйте getAllNetworks() и getNetworkInfo(android.net.Network). - person Eric; 26.09.2016
comment
Хорошо спасибо!! - person MashukKhan; 27.09.2016
comment
Начиная с Android 7.0, вы не можете установить CONNECTIVITY_CHANGE в своем манифесте. Вам нужно сделать это динамически. - person CopsOnRoad; 13.03.2018

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

Под активностью в AndroidManifest:

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

В действии, где выполняются проверки:

boolean network;
int bandwidth;

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    network = isDataConnected();
    bandwidth = isHighBandwidth();
    registerReceiver(new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            network = isDataConnected();
            bandwidth = isHighBandwidth();
        }
    }, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"));
    ...
}
...
private boolean isDataConnected() {
    try {
        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        return cm.getActiveNetworkInfo().isConnectedOrConnecting();
    } catch (Exception e) {
        return false;
    }
}

private int isHighBandwidth() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo info = cm.getActiveNetworkInfo();
    if (info.getType() == ConnectivityManager.TYPE_WIFI) {
        WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        return wm.getConnectionInfo().getLinkSpeed();
    } else if (info.getType() == ConnectivityManager.TYPE_MOBILE) {
        TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        return tm.getNetworkType();
    }
    return 0;
}

Тогда пример использования будет таким:

if (network) {
    if (bandwidth > 16) {
        // Code for large items
    } else if (bandwidth <= 16 && bandwidth > 8) {
        // Code for medium items
    } else {
        //Code for small items
    }
} else {
    //Code for disconnected
}

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

person Abandoned Cart    schedule 13.01.2013

Если вы используете Android Annotations, попробуйте это в своих действиях: это все, остальное генерируется:

@Receiver(actions = ConnectivityManager.CONNECTIVITY_ACTION,
        registerAt = Receiver.RegisterAt.OnResumeOnPause)
void onConnectivityChange() {
    //react
}

Используйте это только в том случае, если вы уже используете AndroidAnnotations — размещение этой зависимости внутри вашего проекта только для этого фрагмента кода было бы излишним.

person luckyhandler    schedule 12.06.2014
comment
Не могли бы вы дать больше объяснений об этом ответе. Я пытался что-то найти, но не смог. В библиотеке аннотаций Google нет аннотации @Receiver. Спасибо! - person Stoycho Andreev; 10.02.2016
comment
Эй, я имею в виду стороннюю библиотеку AndroidAnnotations. Я обновляю свой ответ. - person luckyhandler; 11.02.2016
comment
Да, вы правы, с этой библиотекой это возможно, а также я нашел это github.com/jd-alexander/flender проверьте, неплохо, но использовать можно только с gradle build 1.3, с новой сборкой gradle plugins не работает - person Stoycho Andreev; 12.02.2016

Приведенный выше ответ работает только в том случае, если включены мобильные пакетные данные. В противном случае ConnectivityManager будет нулевым, и вы больше не сможете получить NetworkInfo. Вместо этого можно использовать PhoneStateListener или TelephonyManager.

person noillusion    schedule 27.09.2012