6.4.1 Settings中的WSC处理
本节内容从Settings开始,当选择图6-2左图所示的“WPS PIN条目”后,将弹出图6-2右图所示的WPS设置对话框。该对话框对应的类是WpsDialog中,其代码如下所示。
[—>WpsDialog.java::WpsDialog]
- public WpsDialog(Context context, int wpsSetup) {
- super(context);
- mContext = context;
- mWpsSetup = wpsSetup;
- // PIN和PBC方法都在这个WpsDialog中实现
- class WpsListener implements WifiManager.WpsListener {
- public void onStartSuccess(String pin) {
- if (pin != null) {
- // WSC PIN启动成功,WPAS将动态创建一个PIN码,此处由WpsDialg显示出来
- updateDialog(DialogState.WPS_START, String.format(
- mContext.getString(R.string.wifi_wps_onstart_pin), pin));
- } else {// PBC处理
- updateDialog(DialogState.WPS_START, mContext.getString(
- R.string.wifi_wps_onstart_pbc));
- }
- }
- public void onCompletion() {
- updateDialog(DialogState.WPS_COMPLETE,
- mContext.getString(R.string.wifi_wps_complete));
- }
- public void onFailure(int reason) {
- ......
- }
- mWpsListener = new WpsListener();// 监听WPS操作的结果
- mFilter = new IntentFilter();
- // 监听NETWORK_STATE_CHANGED_ACTION广播
- mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
- mReceiver = new BroadcastReceiver() {
- public void onReceive(Context context, Intent intent) {
- handleEvent(context, intent);// handleEvent的代码比较简单,读者不妨自行阅读。
- }
- };
- }
我们跳过WpsDialog的onCreate函数直接进入其onStart函数,在该函数中,WpsDialog将借助WifiManager和WifiStateMachine交互,相关代码如下所示。
[—>WpsDialog.java::onStart]
- protected void onStart() {
- mTimer = new Timer(false);
- mTimer.schedule(new TimerTask() {
- ......// 更新进度条
- } , 1000, 1000);
- mContext.registerReceiver(mReceiver, mFilter);
- WpsInfo wpsConfig = new WpsInfo();// 构造一个WpsInfo对象
- wpsConfig.setup = mWpsSetup;// 对PIN来说,mWpsSetup的值为WpsInfo.DISPLAY
- // 调用WifiManager的startWps函数,该函数内部将向WifiStateMachine发送START_WPS消息
- mWifiManager.startWps(wpsConfig, mWpsListener);
- }
当手机通过WPS成功加入无线网络后,NETWORK_STATE_CHANGED_ACTION广播将在handleEvent中被处理。这部分代码非常简单,请读者自行阅读。
根据代码中的注释可知,startWps将向WifiStateMachine发送START_WPS消息。WifiStateMachine该如何处理它呢?