如何用 CONNECTIVITY_CHANGE 定义 Broadcastreceiver?
how define Broadcastreceiver with CONNECTIVITY_CHANGE?
我是 android 初学者,想声明一个对 CONNECTIVITY_CHANGE 做出反应的广播接收器。我尝试了以下方法:
private void checkInternet () {
IntentFilter ifilter = new IntentFilter ("android.net.conn.CONNECTIVITY_CHANGE");
broadcastreceiver = new BroadcastReceiver () {
@Override
public void onReceive (Context Context, Intent Intent) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService (getApplicationContext (). CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo ();
if (networkInfo! = null && networkInfo.getState () == NetworkInfo.State.CONNECTED)
Toast.makeText (getApplicationContext (), "Internet", Toast.LENGTH_SHORT) .show ();
else
Toast.makeText (getApplicationContext (), "No Internet", Toast.LENGTH_SHORT) .show ();
}
};
this.registerReceiver (broadcastreceiver, ifilter);
}
在 Actitvity.onCreate 我调用 checkInternet。当我断开 Internet 时,会显示 "No Internet" 和 "Internet" 消息。当我连接到 Internet 时,消息 "No Internet" 和 "Internet" 会以相同的顺序再次出现。有人可以告诉我为什么 Broadcastreceiver 启动 2 次并显示 2 个不同的状态 pro Start 吗?提前谢谢你
试试下面的例子:
实施:
public class NetworkReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
NetworkInfo networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
if (networkInfo != null && networkInfo.getDetailedState() == NetworkInfo.DetailedState.CONNECTED) {
Log.d("Network status: ", "Connected");
} else if (networkInfo != null && networkInfo.getDetailedState() == NetworkInfo.DetailedState.DISCONNECTED) {
Log.d("Network status: ", "Not connected");
}
}
}
}
在您的 AndroidMenifest 中添加接收器:
<receiver
android:name=".receivers.NetworkReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
如果您只需要检查互联网连接,您可以使用以下方法。
在你的 activity
@Override
protected void onCreate(Bundle savedInstanceState){
ConnectionStateMonitor connectionStateMonitor = new ConnectionStateMonitor();
connectionStateMonitor.enable(this);
}
并将此 class 添加到您的 activity
public class ConnectionStateMonitor extends ConnectivityManager.NetworkCallback {
final NetworkRequest networkRequest;
public ConnectionStateMonitor() {
networkRequest = new NetworkRequest.Builder().
addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR).addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build();
}
public void enable(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
connectivityManager.registerNetworkCallback(networkRequest , this);
}
// Likewise, you can have a disable method that simply calls ConnectivityManager#unregisterCallback(networkRequest) too.
@Override
public void onAvailable(Network network) {
//do what you want when Connection is available
}
@Override
public void onLost(Network network){
//Connection Lost
}
}
我认为这比使用广播接收器更容易
创建一个将从 BroadcastReceiver 扩展的新 class。在这里,您定义连接更改的意图过滤器。我们还创建了一个新的私有方法来检索网络连接的当前状态。
public class ConnectivityChangedBroadcastReceiver extends BroadcastReceiver {
public static IntentFilter getIntentFilter() {
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
return intentFilter;
}
@Override
public void onReceive(Context context, Intent intent) {
if (isNetworkAvailable(context)) {
// Network is available
} else {
// Network is not available
}
}
private boolean isNetworkAvailable(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting();
}}
现在像这样在 activity 或应用程序 class 中注册您的广播接收器。请注意,面向 Android 7.0(API 级别 24)及更高版本的应用如果在其清单中声明了广播接收器,则不会收到 CONNECTIVITY_ACTION 广播。如果应用程序使用 Context.registerReceiver() 注册其 BroadcastReceiver 并且该上下文仍然有效,则应用程序仍将接收 CONNECTIVITY_ACTION 广播。所以,如果你想以最新版本的 Android 为目标,那么请确保你在代码中注册了接收器而不是清单
ConnectivityChangedBroadcastReceiver connectivityChangedBroadcastReceiver;
connectivityChangedBroadcastReceiver = new ConnectivityChangedBroadcastReceiver();
registerReceiver(connectivityChangedBroadcastReceiver, ConnectivityChangedBroadcastReceiver.getIntentFilter());
如前所述,所有解决方案均有效,问题出在 VM 上。当我在我的电脑上断开互联网时,虚拟机仍然有物理连接,但只是无法通信。因此,在我的 PC
上断开连接或连接时,消息 "Not connected" "connected" 会按此顺序显示
我是 android 初学者,想声明一个对 CONNECTIVITY_CHANGE 做出反应的广播接收器。我尝试了以下方法:
private void checkInternet () {
IntentFilter ifilter = new IntentFilter ("android.net.conn.CONNECTIVITY_CHANGE");
broadcastreceiver = new BroadcastReceiver () {
@Override
public void onReceive (Context Context, Intent Intent) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService (getApplicationContext (). CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo ();
if (networkInfo! = null && networkInfo.getState () == NetworkInfo.State.CONNECTED)
Toast.makeText (getApplicationContext (), "Internet", Toast.LENGTH_SHORT) .show ();
else
Toast.makeText (getApplicationContext (), "No Internet", Toast.LENGTH_SHORT) .show ();
}
};
this.registerReceiver (broadcastreceiver, ifilter);
}
在 Actitvity.onCreate 我调用 checkInternet。当我断开 Internet 时,会显示 "No Internet" 和 "Internet" 消息。当我连接到 Internet 时,消息 "No Internet" 和 "Internet" 会以相同的顺序再次出现。有人可以告诉我为什么 Broadcastreceiver 启动 2 次并显示 2 个不同的状态 pro Start 吗?提前谢谢你
试试下面的例子:
实施:
public class NetworkReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
NetworkInfo networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
if (networkInfo != null && networkInfo.getDetailedState() == NetworkInfo.DetailedState.CONNECTED) {
Log.d("Network status: ", "Connected");
} else if (networkInfo != null && networkInfo.getDetailedState() == NetworkInfo.DetailedState.DISCONNECTED) {
Log.d("Network status: ", "Not connected");
}
}
}
}
在您的 AndroidMenifest 中添加接收器:
<receiver
android:name=".receivers.NetworkReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
如果您只需要检查互联网连接,您可以使用以下方法。 在你的 activity
@Override
protected void onCreate(Bundle savedInstanceState){
ConnectionStateMonitor connectionStateMonitor = new ConnectionStateMonitor();
connectionStateMonitor.enable(this);
}
并将此 class 添加到您的 activity
public class ConnectionStateMonitor extends ConnectivityManager.NetworkCallback {
final NetworkRequest networkRequest;
public ConnectionStateMonitor() {
networkRequest = new NetworkRequest.Builder().
addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR).addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build();
}
public void enable(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
connectivityManager.registerNetworkCallback(networkRequest , this);
}
// Likewise, you can have a disable method that simply calls ConnectivityManager#unregisterCallback(networkRequest) too.
@Override
public void onAvailable(Network network) {
//do what you want when Connection is available
}
@Override
public void onLost(Network network){
//Connection Lost
}
}
我认为这比使用广播接收器更容易
创建一个将从 BroadcastReceiver 扩展的新 class。在这里,您定义连接更改的意图过滤器。我们还创建了一个新的私有方法来检索网络连接的当前状态。
public class ConnectivityChangedBroadcastReceiver extends BroadcastReceiver {
public static IntentFilter getIntentFilter() {
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
return intentFilter;
}
@Override
public void onReceive(Context context, Intent intent) {
if (isNetworkAvailable(context)) {
// Network is available
} else {
// Network is not available
}
}
private boolean isNetworkAvailable(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting();
}}
现在像这样在 activity 或应用程序 class 中注册您的广播接收器。请注意,面向 Android 7.0(API 级别 24)及更高版本的应用如果在其清单中声明了广播接收器,则不会收到 CONNECTIVITY_ACTION 广播。如果应用程序使用 Context.registerReceiver() 注册其 BroadcastReceiver 并且该上下文仍然有效,则应用程序仍将接收 CONNECTIVITY_ACTION 广播。所以,如果你想以最新版本的 Android 为目标,那么请确保你在代码中注册了接收器而不是清单
ConnectivityChangedBroadcastReceiver connectivityChangedBroadcastReceiver;
connectivityChangedBroadcastReceiver = new ConnectivityChangedBroadcastReceiver();
registerReceiver(connectivityChangedBroadcastReceiver, ConnectivityChangedBroadcastReceiver.getIntentFilter());
如前所述,所有解决方案均有效,问题出在 VM 上。当我在我的电脑上断开互联网时,虚拟机仍然有物理连接,但只是无法通信。因此,在我的 PC
上断开连接或连接时,消息 "Not connected" "connected" 会按此顺序显示