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
使用广播接收机,使得它触发连接时发生改变
我已经研究过这一点,但没有什么是坚实的,当连接发生变化时它会告诉应用程序。当我尝试将其实现到我的清单中时,“CONNECTIVITY_ACTION”不存在。我错过了什么? – svguerin3
您是否在清单文件中定义了接收器? –
我以前见过,但我不确定如何具体实现它。我在实施清单条目时看不到“CONNECTIVITY_ACTION”。 – svguerin3
从清单中隐式注册的'CONNECTIVITY_ACTION'的api 24和up接收者不会被调用。因此,你应该通过'Context.registerReceiver'来完成。所有这些都在我在原始答案中链接的文档中。 – TrevJonez