用于互联网连接的广播接收器不起作用



我正在尝试创建一个跟踪互联网连接的应用程序。当互联网连接状态发生变化时,它应该敬酒。为此,我应该使用广播接收器。到目前为止,我已经编写(找到(了这段代码(以下代码仅包含与此作业相关的部分(

ConnectivityReceiver mConnectivityReceiver;
IntentFilter mConnectivityIntentFilter;
@Override
protected void onCreate(Bundle savedInstanceState) {
....
mConnectivityIntentFilter = new IntentFilter();
mConnectivityIntentFilter.addAction(Intent.ACTION_MANAGE_NETWORK_USAGE);
mConnectivityReceiver = new ConnectivityReceiver();
....
}
@Override
protected void onResume() {
super.onResume();
registerReceiver(mConnectivityReceiver, mConnectivityIntentFilter);
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(mConnectivityReceiver);
}
public class ConnectivityReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("onreceive", "success");
ConnectivityManager connMgr =
(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
boolean isWifiConn = false;
boolean isMobileConn = false;
for (Network network : connMgr.getAllNetworks()) {
NetworkInfo networkInfo = connMgr.getNetworkInfo(network);
if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
isWifiConn |= networkInfo.isConnected();
}
if (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
isMobileConn |= networkInfo.isConnected();
}
}
if (isMobileConn || isWifiConn) {
Toast.makeText(getApplicationContext(), "Internet connected", Toast.LENGTH_LONG).show();
}
else {
Toast.makeText(getApplicationContext(), "Internet connection lost, may cause some functions to not work properly", Toast.LENGTH_LONG).show();
}
}
}

我在清单中拥有这两个权限.xml

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

我在模拟器(Android 8.0(和设备(Android 5.1(上都尝试过,但我的代码不起作用。它不会发出吐司,甚至不会创建日志。

我做错了什么?

提前感谢!

我有点猜测,但我认为您也需要清单中的intent-filter(请参阅此答案(。

如果您只想在连接更改时做一些简单的事情,请尝试一下,有一个更简单的解决方案。

在您的活动中创建宽播接收器:

private BroadcastReceiver networkStateReceiver=new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = manager.getActiveNetworkInfo();
doSomethingOnNetworkChange(ni);
}
};

然后在 onResume 和 onPause 中进行注册:

@Override
public void onResume() {
super.onResume();
registerReceiver(networkStateReceiver, new 
IntentFilter(android.net.ConnectivityManager.CONNECTIVITY_ACTION));
}
@Override
public void onPause() {
unregisterReceiver(networkStateReceiver);
super.onPause();
}

最新更新