在android中wifi打开的状态从DISABLED--ENABLING--ENABLED 1 WifiSettings.java--wifi界面wifi开关 wifi开关定义在SettingsActivity.java中,传入WifiEnabler.ja

在android中wifi打开的状态从DISABLED-->ENABLING-->ENABLED

1 WifiSettings.java--wifi界面wifi开关

wifi开关定义在SettingsActivity.java中,传入WifiEnabler.java,并在WifiEnabler.java中响应。

private SwitchBar mSwitchBar;

public SwitchBar getSwitchBar() {

return mSwitchBar;

}

mSwitchBar = (SwitchBar) findViewById(R.id.switch_bar);

private SwitchBar mSwitchBar;

public SwitchBar getSwitchBar() {

return mSwitchBar;

}

mSwitchBar = (SwitchBar) findViewById(R.id.switch_bar);

2 WifiEnabler.java--响应点击wifi开关

WifiEnabler.java实际处理开关wifi的消息。

@Override

public void onSwitchChanged(Switch switchView, boolean isChecked) {

Log.d(TAG, "mWifiManager.setWifiEnabled");

if (!mWifiManager.setWifiEnabled(isChecked)) {

// Error

Log.d(TAG, "set wifi enabled error");

mSwitchBar.setEnabled(true);

Toast.makeText(mContext, R.string.wifi_error, Toast.LENGTH_SHORT).show();

}

}3 WifiManager.java和WifiService.java

WifiEnabler.java调用WifiManager,WifiManager调用WifiService.

mService.setWifiEnabled(enabled); public synchronized boolean setWifiEnabled(boolean enable) {

Slog.d(TAG, "setWifiEnabled: " + enable + " pid=" + Binder.getCallingPid()

+ ", uid=" + Binder.getCallingUid());

if (DBG) {

Slog.e(TAG, "Invoking mWifiStateMachine.setWifiEnabled\n");

}

if (!mIsControllerStarted) {

Slog.e(TAG,"WifiController is not yet started, abort setWifiEnabled");

return false;

}

mWifiController.sendMessage(CMD_WIFI_TOGGLED);

return true;

}

4 WifiController.java

WifiController.java处理开关wifi 的消息CMD_WIFI_TOGGLED,从ApStaDisabledState-->StaEnabledState-->DeviceActiveState,

class ApStaDisabledState extends State {

@Override

public boolean processMessage(Message msg) {

switch (msg.what) {

case CMD_WIFI_TOGGLED:

case CMD_AIRPLANE_TOGGLED:

if (mSettingsStore.isWifiToggleEnabled()) {

if (doDeferEnable(msg)) {

if (mHaveDeferredEnable) {

// have 2 toggles now, inc serial number an ignore both

mDeferredEnableSerialNumber++;

}

mHaveDeferredEnable = !mHaveDeferredEnable;

break;

}

if (mDeviceIdle == false) {

transitionTo(mDeviceActiveState);

} else {

checkLocksAndTransitionWhenDeviceIdle();

}

} else if (mSettingsStore.isScanAlwaysAvailable()) {

transitionTo(mStaDisabledWithScanState);

}

break;

}

class StaEnabledState extends State {

@Override

public void enter() {

mWifiStateMachine.setSupplicantRunning(true);

}

}

在进入StaEnabledState时由WifiStateMachine启动supplicant,,进入DeviceActiveState时启动driver。

/* Parent: StaEnabledState */@OverridemWifiStateMachinemWifiStateMachinemWifiStateMachine}}

5 WifiStateMachine.java

WIFI_STATE_ENABLED由SupplicantStartingState发出,   CMD_START_SUPPLICANT-->startMonitoring-->WifiMonitor.SUP_CONNECTION_EVENT-->WifiManager.WIFI_STATE_ENABLED,到此wifi开关完全打开。

class InitialState extends State {

@Override

public boolean processMessage(Message message) {

switch (message.what) {

case CMD_START_SUPPLICANT:

if (mWifiNative.loadDriver()) {

mNwService.wifiFirmwareReload(mInterfaceName, "STA");

if(mWifiNative.startSupplicant(mP2pSupported)) {

setWifiState(WIFI_STATE_ENABLING);

mWifiMonitor.startMonitoring();

transitionTo(mSupplicantStartingState);

}

}

break;

}

}

@OverridesetWifiStatebreak;

}

}

6  SoftAP打开失败wifi不能打开原因分析

SoftAP打开过程:

WifiService的setWifiApEnabled-->WifiController的CDM_SET_AP-->WifiStateMachine的CMD_START_AP

class SoftApStartingState extends State {

@Override

public void enter() {

if (message.what == CMD_START_AP) {

final WifiConfiguration config = (WifiConfiguration) message.obj;

if (config == null) {

mWifiApConfigChannel.sendMessage(CMD_REQUEST_AP_CONFIG);

}

}

}

@Override

public boolean processMessage(Message message) {

switch(message.what) {

case CMD_START_AP:

deferMessage(message);

break;

case WifiStateMachine.CMD_RESPONSE_AP_CONFIG:

WifiConfiguration config = (WifiConfiguration) message.obj;

if (config != null) {

startSoftApWithConfig(config);

}

break;

case CMD_START_AP_FAILURE:

setWifiApState(WIFI_AP_STATE_FAILED);

transitionTo(mInitialState);

break;

}

}

}

CMD_REQUEST_AP_CONFIG-->CMD_RESPONSE_AP_CONFIG-->startSoftApWithConfig-->CMD_START_FAILURE

由于WifiService没有收到WIFI_AP_START_FAILED,导致WifiController处于ApEnabledState,无法接收CMD_WIFI_TOGGLED消息,从而无法进入WifiStateMachie打开WIfi。

android 网络错误分析,android wifi打开过程源码解析及Wifi打开失败原因分析相关推荐

  1. android 网络通信方式,Android中基于TCP协议的网络通信

    一.Android网络简介 Android与服务器的通信方式主要有两种,一种是Http通信,另一种是Socket通信. HTTP通信:Android中内置HttpClient,这样可以发方便的发送Ht ...

  2. Android Launcher启动应用程序流程源码解析

    带着问题看源码 点击桌面Launcher图标后做了哪些工作? 应用程序什么时候被创建的? Application和MainActivity的onCreate()方法什么时候被调用的? 概述 在Andr ...

  3. 【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( 使用 DexClassLoader 获取组件类失败 | 失败原因分析 | 自定义类加载器没有加载组件类的权限 )

    文章目录 一.使用 DexClassLoader 获取组件类失败报错 二.失败原因分析 一.使用 DexClassLoader 获取组件类失败报错 在上一篇博客 [Android 逆向]启动 DEX ...

  4. Android View体系(五)从源码解析View的事件分发机制

    Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源码解析Sc ...

  5. Android多页蒙版遮罩引导功能(源码+解析)

    #Android多页蒙版遮罩引导功能(源码+解析) 需求:博主前段时间做的教育类型APP,需要引导用户(低龄化小朋友),播放器的播放,页面可以左右滑动,以及右上方进入答题卡入口(小朋友都是很聪明的,引 ...

  6. php7应用程序无法启动,window_win7系统打开软件提示应用程序无法启动的故障原因分析及2种解决方法,      nbs - phpStudy...

    win7系统打开软件提示应用程序无法启动的故障原因分析及2种解决方法 win7系统打开软件提示应用程序无法启动,因为应用程序的并行配置不正确,具体问题现象如下图所示: 故障原因分析: 一个可能是Win ...

  7. 云原生小课堂|Envoy请求流程源码解析(三):请求解析

    ​ 前言 Envoy 是一款面向 Service Mesh 的高性能网络代理服务.它与应用程序并行运行,通过以平台无关的方式提供通用功能来抽象网络.当基础架构中的所有服务流量都通过 Envoy 网格时 ...

  8. Spark SQL 工作流程源码解析(四)optimization 阶段(基于 Spark 3.3.0)

    前言 本文隶属于专栏<大数据技术体系>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见大数据技术体系 目录 Spark SQL 工 ...

  9. Quantopian教程源码解析及实战

    Quantopian教程源码解析及实战 ​ 本文主要侧重于采用Quantopian进行实际的金融策略分析,因此阅读本文前,需要对Quantopian的有基本的了解,建议先阅读Quantopian的tu ...

  10. Myth源码解析系列之六- 订单下单流程源码解析(发起者)

    前面一章我们走完了服务启动的源码,这次我们进入下单流程的源码解析~ 订单下单流程源码解析(发起者) 首先保证myth-demo-springcloud-order.myth-demo-springcl ...

最新文章

  1. 计算机408试题2014,2014年考研计算机统考408真题
  2. k-Nearest Neighbors 实战1 简单的电影分类实例
  3. JQuery系列(4) - AJAX方法
  4. IS环境下配置PHP5+MySql+PHPMyAdmin
  5. MP3技术白皮书-音频格式全解析
  6. php 修改excel内容吗,php更新修改excel中的内容例子
  7. php nginx错误,PHP/Nginx错误(Win)
  8. 海康大华PC客户端集成播放器
  9. nifi集群_nifi架构
  10. Android应用调用第三方地图应用导航
  11. itest软件测试工具,itest(爱测试)
  12. 解密微信电脑版image文件夹下缓存的用户图片
  13. springboot实战—BMI体脂计算器-服务器端
  14. mysql fastdfs_FastDFS监控系统Fastdfs-zyc配置
  15. 【财经期刊FM-Radio|2021年03月04日】
  16. 图像的高频信息和低频信息的含义
  17. cv::mat与unsigned char*相互转化之间的转换
  18. java实现阿里大于短信发送服务
  19. Qt课程设计--用qt实现计算器的功能
  20. 【大学篇】大学的意义

热门文章

  1. 【狂神说Redis】4 三种特殊数据类型
  2. 投影查询(2020-3-13)
  3. 读取doc文件c语言程序,c语言程序中关于文件的操作.doc
  4. @PropertySource 解析 yml 配置文件,自定义解析 yaml 工厂类
  5. 向视图中插入的数据能进入到基本表中去吗?_数据库调优,调的是什么及常见手法...
  6. vue-cli3安装遇到的问题,卸载不掉旧版本,导致更新不了
  7. 一文读懂如何用深度学习实现网络安全
  8. nodejs导出excel
  9. ssh 遍历IPS 进行连接
  10. 大规模机器学习:将数据科学引入生产系统架构的典型模式