Android - 监控互联网连接状态

问题描述:

在我们的应用程序中,我们希望能够持续检查连接状态,如果发生故障,请抛出Toast或某种用户界面来向用户表明它已关闭。我尝试在API调用时在我们的Retrofit Api-Builder类中执行此操作,但它似乎并不喜欢Toasts(导致崩溃)。Android - 监控互联网连接状态

iOS有监视功能,但它似乎在Android上,我们必须手动检查。考虑到有多个活动等,在我们的应用程序中是否有简单/干净的方法?

这是我的表现如何监控网络连接状态。创建一个Java类并将其命名为NetworkStateChangeReceiver

NetworkStateChangeReceiver

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.support.v4.content.LocalBroadcastManager; 
import android.util.Log; 
import static android.content.Context.CONNECTIVITY_SERVICE; 

public class NetworkStateChangeReceiver extends BroadcastReceiver { 
public static final String NETWORK_AVAILABLE_ACTION = "yourapp.packagename.NetworkAvailable"; 
public static final String IS_NETWORK_AVAILABLE = "isNetworkAvailable"; 

@Override 
public void onReceive(Context context, Intent intent) { 
    Intent networkStateIntent = new Intent(NETWORK_AVAILABLE_ACTION); 
    networkStateIntent.putExtra(IS_NETWORK_AVAILABLE, isConnectedToInternet(context)); 

LocalBroadcastManager.getInstance(context).sendBroadcast(networkStateIntent); 
} 

private boolean isConnectedToInternet(Context context) { 
    try { 
     if (context != null) { 
      ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(CONNECTIVITY_SERVICE); 
      NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); 
      return networkInfo != null && networkInfo.isConnected(); 
     } 
     return false; 
    } catch (Exception e) { 
     Log.e(NetworkStateChangeReceiver.class.getName(), e.getMessage()); 
     return false; 
    } 
} 
} 

在您的MainActivity,添加以下代码行。

IntentFilter intentFilter = new 
IntentFilter(NetworkStateChangeReceiver.NETWORK_AVAILABLE_ACTION); 
    LocalBroadcastManager.getInstance(this).registerReceiver(new 
BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      boolean isNetworkAvailable = intent.getBooleanExtra(IS_NETWORK_AVAILABLE, false); 
      String networkStatus = isNetworkAvailable ? "Connected!" : "Disconnected!"; 

      final SweetAlertDialog CC = new SweetAlertDialog(MainActivity.this, SweetAlertDialog.WARNING_TYPE); 
      CC.setTitleText("Network Status"); 
      CC.setContentText(networkStatus); 
      CC.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); 
      CC.setCancelable(false); 
      CC.show(); 

您可以使用简单的alertdialog或toast来显示消息。我已经使用了SweetAlertDialog Library更清洁的用户界面。

您可以注册将被告知连接更改的广播接收器。

信息在Monitor for Changes in Connectivity标题下。 https://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html

+0

我以前见过,但我不确定如何具体实现它。我在实施清单条目时看不到“CONNECTIVITY_ACTION”。 – svguerin3

+0

从清单中隐式注册的'CONNECTIVITY_ACTION'的api 24和up接收者不会被调用。因此,你应该通过'Context.registerReceiver'来完成。所有这些都在我在原始答案中链接的文档中。 – TrevJonez

使用广播接收机,使得它触发连接时发生改变

+0

我已经研究过这一点,但没有什么是坚实的,当连接发生变化时它会告诉应用程序。当我尝试将其实现到我的清单中时,“CONNECTIVITY_ACTION”不存在。我错过了什么? – svguerin3

+0

您是否在清单文件中定义了接收器? –