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

11

我在Google Developer上读到:

每当连接细节更改时,使用("android.net.conn.CONNECTIVITY_CHANGE")操作。

这是我的代码:

public class MainActivity extends 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;
    }
}

公共类 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;
}

第一次启动应用时,这个意图总是会被触发并显示一个对话框,其中包含当前网络状态。但根据此文档,它只会在连接改变时发生?如果我希望仅在网络状态更改时显示此内容,我该怎么做?非常感谢。

1个回答

34

android.net.conn.CONNECTIVITY_CHANGE广播是一个粘性广播。这意味着每当您为此操作注册BroadcastReceiver时,它将立即被触发,并且onReceive()将使用最近的广播连接更改调用。这允许您获取连接状态的当前状态,而无需等待某些内容进行更改。

如果您想忽略当前状态,并且只想处理状态更改,则可以在onReceive()中添加以下内容:

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

1
非常感谢。在看到你的回答之前,我已经做过了,而且它也起作用 :D - Truong Vu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接