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

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

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

Новый класс 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 под элементом «manifest»:

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

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

 <receiver android:name="com.blackboard.androidtest.receiver.ConnectionChangeReceiver" android:label="NetworkConnection"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> </intent-filter> </receiver> 

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

Под этой деятельностью в 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 } 

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

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

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

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

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