无线网络变化的广播操作

6
在我的应用程序中,我必须在设备连接或断开WIFI网络时得到通知。为此,我必须使用BroadcastReceiver,但在阅读不同的文章和SO上的问题后,我有点困惑应该使用哪个广播操作。我认为我有三个选择: 为了减少资源消耗,我真的只希望在设备连接到WIFI网络(并且已接收到IP地址)或设备从网络中断开连接时得到通知。我不关心其他状态,例如“CONNECTING”等。

你认为我应该使用哪种最佳的广播动作?而且在onReceive中,我是否需要手动过滤事件(因为我收到的不仅仅是CONNECTEDDISCONNECTED)?

编辑:正如我在下面的评论中指出的那样,我认为SUPPLICANT_CONNECTION_CHANGE_ACTION对我来说是最好的选择,但它从未被我的应用程序触发或接收。 其他人也有这个问题,但从未提出真正的解决方案(实际上使用了其他广播)。有任何想法吗?


哪里存在歧义?Android SUPPLICANT_CONNECTION_CHANGE_ACTION文档明确指出:“广播意图操作,指示已建立与supplicant的连接(现在可以执行Wi-Fi操作),或者与supplicant的连接已丢失。一个额外的布尔值提供了连接状态,其中true表示已连接。”其他意图具有额外的附加项,可以告诉您Wifi状态或携带更改的网络信息的完整NetworkInfo对象。我认为根据您的要求使用(1)是相当直接的。 - Rahul Shukla
你是对的,但问题在于我的应用程序从未收到 SUPPLICANT_CONNECTION_CHANGE_ACTION ,根据我在其他问题中的阅读来看,这是一个常见问题。据我所知,并非所有手机都会触发此广播。 - Cilenco
如果这两个广播对你有用的话,那么毫无疑问你应该使用它们中的任何一个。 - Rahul Shukla
2个回答

2

您可以使用WifiManager.NETWORK_STATE_CHANGED_ACTION来进行操作。

在Manifest、Fragment或Activity中注册接收器,并使用WifiManager.NETWORK_STATE_CHANGED_ACTION动作,根据您的需要选择适当的方式。

覆盖接收器:

@Override
public void onReceive(Context context, Intent intent) {

    final String action = intent.getAction();

    if(action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)){
        NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
        boolean connected = info.isConnected();
        if (connected)
        //call your method
    }      
}

1
请尝试。
@Override
protected void onResume() {
    super.onResume();
    IntentFilter filter = new IntentFilter();
    filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
    filter.addAction("android.net.wifi.STATE_CHANGE");
    registerReceiver(networkChangeReceiver, filter);
}

@Override
protected void onDestroy() {
    unregisterReceiver(networkChangeReceiver);
    super.onDestroy();
}

and

BroadcastReceiver networkChangeReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {

        if (!AppUtils.hasNetworkConnection(context)) {
            showSnackBarToast(getNetworkErrorMessage());
        }

    }
};

我正在使用这个,对我很有用。希望它也能帮到你。


谢谢,但我知道该怎么做。真正的问题是,如果这个IntentFilter(其中使用了动作)是仅获取连接和断开事件的最佳解决方案。 - Cilenco

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