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广播相关的问题,也可以参考上面提到的源代码,自己查找:)最后,一个有效的问题。非常感谢你。你的用例正是我的。愿上帝在你的道路上微笑!