编辑:
使用我的三星 S4 (I959) 设备进行测试时,我的广播接收器无法接收到广播。使用 ConnectivityManager.CONNECTIVITY_ACTION 的常用方法似乎在不同制造商之间更可靠。所以你可能想改用它。
以下是我之前对该广播的调查。
这是我从 4.4.4_r1 源代码中得到的。
来自WifiStateMachinesource,首先看到的是状态机的状态,也就是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 state in NetworkInfo extra随之带有WifiInfo。
最后但同样重要的是,我们回顾了历史。个人对 4.x 平台比较感兴趣,所以转向了 4.0.1_r1 的源码。这个版本似乎比后一个版本更具可读性,这有点令人惊讶。可以发现sendNetworkStateChangeBroadcast在handleSuccessfulIpConfiguration(和其他方法)内部被触发,当ip配置成功时,ConnectingState.processMessage()和ConnectedState.processMessage()被触发。
所以我们终于得出结论,使用WifiManager.NETWORK_STATE_CHANGED_ACTION跟踪成功的无线连接,是安全合适的。
如果你还有其他关于WifiManager广播的问题,也可以参考上面提到的源码自己去寻找:)