我知道大多数人会在连接更改时检查ConnectivityManager.CONNECTIVITY_ACTION以接收广播。但是,在某些情况下,您可能只想在无线连接成功建立后得到通知。就个人而言,我的情况是,当用户连接到某些无线网络时,我需要发布登录请求。经过一番谷歌搜索后,我进入了WifiManager.NETWORK_STATE_CHANGED_ACTION,但是它的表述不佳,因此怀疑其可靠性。因此,我需要确认无线配置成功完成后,是否始终会触发此意图。无论如何,这是我在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 }} 最佳答案 编辑:使用Samsung S4(I959)设备进行测试时,我的广播接收器无法接收广播。在不同制造商之间,使用ConnectivityManager.CONNECTIVITY_ACTION的通用方法似乎更可靠。因此您可能要改用它。以下是我对此广播的先前调查。这是我从4.4.4_r1源获得的。从WifiStateMachine source,首先要看到的是状态机的状态,即inside its constructor。注意,后者是前者的父状态。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);幸运的是,这些名字几乎是不言自明的。您可以轻松地注意到我们感兴趣的状态。要查看实际发生的情况,我们可以在源中搜索这些状态。我们研究的第一种方法是sendNetworkStateChangeBroadcast。可以在VerifyingLinkState和CaptivePortalCheckState中识别它的调用,还有一些您可能会自己发现的。在CaptivePortalCheckState内部,当processing CMD_CAPTIVE_CHECK_COMPLETE时,您最终可以确认检查完成并且网络已完全配置后,我们将在应用程序中收到状态更改意图,其中CONNECTED状态在NetworkInfo中,另外还有。最后但并非最不重要的一点,我们回顾历史。我个人对4.x平台感兴趣,因此我转向4.0.1_r1的源代码。令人惊讶的是,该版本比后一版本更具可读性。您会发现在WifiInfo(和其他方法)中触发了sendNetworkStateChangeBroadcast,在成功配置ip时会在handleSuccessfulIpConfiguration和ConnectingState.processMessage()中触发。因此,我们最终得出结论,使用ConnectedState.processMessage()跟踪成功的无线连接是安全且适当的。如果您还有其他与WifiManager广播有关的问题,也可以参考上面提到的源代码并自己找到:)关于android - 成功建立Wifi连接后,使用WifiManager.NETWORK_STATE_CHANGED_ACTION接收广播是否安全?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25110574/
10-10 08:52