Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 成功建立Wifi连接后,使用WifiManager.NETWORK\u STATE\u更改\u操作以接收广播是否安全?_Android_Broadcastreceiver_Android Wifi - Fatal编程技术网

Android 成功建立Wifi连接后,使用WifiManager.NETWORK\u STATE\u更改\u操作以接收广播是否安全?

Android 成功建立Wifi连接后,使用WifiManager.NETWORK\u STATE\u更改\u操作以接收广播是否安全?,android,broadcastreceiver,android-wifi,Android,Broadcastreceiver,Android Wifi,我知道大多数人在连接发生变化时检查是否接收广播。但是,在某些情况下,您可能只希望在成功建立无线连接时收到通知 就我个人而言,我的情况是,当用户连接到某个无线网络时,我需要发布一个登录请求。在谷歌搜索了一番之后,我终于找到了它,但它的教育程度很低,因此它的可靠性受到了怀疑。因此,我需要确认此意图是否总是在无线配置成功完成后激发 无论如何,下面是我在我的广播接收器中使用的代码: public class StateChangedReceiver extends BroadcastReceiver {

我知道大多数人在连接发生变化时检查是否接收广播。但是,在某些情况下,您可能只希望在成功建立无线连接时收到通知

就我个人而言,我的情况是,当用户连接到某个无线网络时,我需要发布一个登录请求。在谷歌搜索了一番之后,我终于找到了它,但它的教育程度很低,因此它的可靠性受到了怀疑。因此,我需要确认此意图是否总是在无线配置成功完成后激发

无论如何,下面是我在我的
广播接收器中使用的代码:

public class StateChangedReceiver extends BroadcastReceiver {

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

        NetworkInfo networkInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
        if (!networkInfo.isConnected()) {
            return;
        }

        WifiInfo wifiInfo = intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO);
        if (!wifiInfo.getSSID().equals(THE_SSID_YOU_ARE_LOOKING_FOR)) {
            return;
        }

        // Do something
    }
}
编辑:

使用三星S4(I959)设备进行测试时,我的广播接收器无法接收广播。使用ConnectivityManager.CONNECTIVITY\u操作的通用方法在不同制造商之间似乎更可靠。所以你可能想用它来代替

以下是我之前对这次广播的调查


以下是我从4.4.4_r1源代码获得的信息

WifiStateMachine
中,首先要看到的是状态机的状态,即。请注意,后者是前者的父状态

addState(mDefaultState);
    addState(mInitialState, mDefaultState);
    addState(mSupplicantStartingState, mDefaultState);
    addState(mSupplicantStartedState, mDefaultState);
        addState(mDriverStartingState, mSupplicantStartedState);
        addState(mDriverStartedState, mSupplicantStartedState);
            addState(mScanModeState, mDriverStartedState);
            addState(mConnectModeState, mDriverStartedState);
                addState(mL2ConnectedState, mConnectModeState);
                    addState(mObtainingIpState, mL2ConnectedState);
                    addState(mVerifyingLinkState, mL2ConnectedState);
                    addState(mCaptivePortalCheckState, mL2ConnectedState);
                    addState(mConnectedState, mL2ConnectedState);
                addState(mDisconnectingState, mConnectModeState);
                addState(mDisconnectedState, mConnectModeState);
                addState(mWpsRunningState, mConnectModeState);
        addState(mWaitForP2pDisableState, mSupplicantStartedState);
        addState(mDriverStoppingState, mSupplicantStartedState);
        addState(mDriverStoppedState, mSupplicantStartedState);
    addState(mSupplicantStoppingState, mDefaultState);
    addState(mSoftApStartingState, mDefaultState);
    addState(mSoftApStartedState, mDefaultState);
        addState(mTetheringState, mSoftApStartedState);
        addState(mTetheredState, mSoftApStartedState);
        addState(mUntetheringState, mSoftApStartedState);
谢天谢地,这些名字几乎不言自明。你可以很容易地注意到我们感兴趣的州。为了了解真正发生了什么,我们可以搜索这些状态的来源

我们研究的第一种方法是。它的调用可以在内部和外部进行识别,其他一些您可以自己发现

CaptivePortalCheckState
内部,当您最终确认检查完成且网络完全配置后,我们将在
NetworkInfo
中的
CONNECTED
state以及
WifiInfo
的应用程序中收到状态更改意图

最后但并非最不重要的是,我们回顾历史。就我个人而言,我对4.x平台感兴趣,所以我转向了4.0.1_r1的源代码。令人惊讶的是,这个版本似乎比后一个版本更具可读性。您可以找到在内部激发的方法(以及其他方法),该方法在成功配置ip时在中激发

因此,我们最终得出结论,使用跟踪成功的无线连接是安全和适当的


如果您还有任何与WifiManager广播相关的问题,也可以参考上面提到的源代码,自己查找:)

最后,一个有效的问题。非常感谢你。你的用例正是我的。愿上帝在你的道路上微笑!