android - BroadcastReceiver CONNECTIVITY_CHANGE 总是在第一次启动应用程序时运行?

标签 android android-activity broadcastreceiver

我在 Google Developer 上阅读了它:

("android.net.conn.CONNECTIVITY_CHANGE") action whenever the connectivity details have changed

我有这个代码:

公共(public)类 MainActivity 扩展 AppCompatActivity {

private NetworkChangeReceiver receiver;
private boolean connIntentFilterIsRegistered;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    receiver = new NetworkChangeReceiver();
}

@Override
protected void onPause() {
    super.onPause();
    if (connIntentFilterIsRegistered) {
        unregisterReceiver(receiver);
        connIntentFilterIsRegistered = false;
    }
}

@Override
protected void onResume() {
    super.onResume();
    if (!connIntentFilterIsRegistered) {
        registerReceiver(receiver, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"));
        connIntentFilterIsRegistered = true;
    }
}

和 //

公共(public)类 NetworkUtil {

public static int TYPE_WIFI = 1;
public static int TYPE_MOBILE = 0;
public static int TYPE_NOT_CONNECTED = 2;

public static int getConnectivityStatus(Context context) {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    if (activeNetwork != null && activeNetwork.isConnectedOrConnecting()) {
        if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
            return TYPE_WIFI;
        }
        if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
            return TYPE_MOBILE;
        }
    }
    return TYPE_NOT_CONNECTED;
}

public static String getConnectivityStatusString(Context context) {
    int conn = NetworkUtil.getConnectivityStatus(context);
    String status = null;
    if (conn == TYPE_MOBILE) {
        status = "Mobile cellular enabled";
    } else if (conn == TYPE_WIFI) {
        status = "Wifi enabled";
    } else if (conn == TYPE_NOT_CONNECTED) {
        status = "Not connected to internet";
    }
    return status;
}

当我第一次启动应用程序时,此 Intent 总是会触发并显示一个包含当前网络状态的对话框。但是根据这个文件,只有当连接改变时才会发生?如果我只想在网络发生变化时显示此内容,我该怎么办?非常感谢

最佳答案

广播 android.net.conn.CONNECTIVITY_CHANGE 是一个粘性广播。这意味着每当您为此 ACTION 注册一个 BroadcastReceiver 时,它总是会立即被触发,并且 onReceive() 将随着最近的广播连接变化<被调用/强>。这使您无需等待更改即可获得连接的当前状态。

如果你想忽略当前状态,只想处理状态变化,你可以将这个添加到你的onReceive():

if (isInitialStickyBroadcast()) {
    // Ignore this call to onReceive, as this is the sticky broadcast
} else {
    // Connectivity state has changed
    ... (your code here)
}

关于android - BroadcastReceiver CONNECTIVITY_CHANGE 总是在第一次启动应用程序时运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36449530/

相关文章:

android - 默认显示 android SearchView EditText

android - 如何使用bundletool从AAB生成APK(不是APKS)?

java - 通过多个 Activity 保存信息的静态类

java - Android 与 iPhone 的应用程序质量如何?其背后的原因是什么?

javascript - 如何在Android Hybrid App上加载远程网页(最简单的方法)?

android - 返回到 MainActivity 的按钮

使用 Activity 别名时 Android 构建失败

android:即使应用程序关闭也能收到短信

java - BroadcastReceiver 未收到相机按钮上的按键

Android - 如何检测 Action 媒体按钮长按