热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

(一百三十二)AndroidOWiFi重启机制学习——重启流程

1.WiFi重启在日常生活中,WiFi使用过程中出现异常用户一般都会手动关闭再打开WiFi完成一次重启,那么Android机制是否有类似的呢ÿ
1.WiFi重启

在日常生活中,WiFi使用过程中出现异常用户一般都会手动关闭再打开WiFi完成一次重启,那么Android机制是否有类似的呢?

 

2.重启流程探究

偶然间看到一个类叫做SelfRecovery,该类有将WiFi重启的接口

2.1 SelfRecovery

/*** This class is used to recover the wifi stack from a fatal failure. The recovery mechanism* involves triggering a stack restart (essentially simulating an airplane mode toggle) using* {@link WifiController}.* The current triggers for:* 1. Last resort watchdog bite.* 2. HAL/wificond crashes during normal operation.* 3. TBD: supplicant crashes during normal operation.*/

api中简要说明了这个类是用来将WiFi从异常状态恢复的。恢复机制是通过WifiController触发一个重启,基本模拟了一次飞行模式切换。

当前触发条件

  • 看门狗
  • 正常操作过程中的HAL/wificond crashes
  • TBD:正常操作过程中的supplicant crashes(暂未有对应处理)

/*** Trigger recovery.** This method does the following:* 1. Raises a wtf.* 2. Sends {@link WifiController#CMD_RESTART_WIFI} to {@link WifiController} to initiate the* stack restart.* @param reason One of the above |REASON_*| codes.*/public void trigger(int reason) {if (!(reason == REASON_LAST_RESORT_WATCHDOG || reason == REASON_HAL_CRASH|| reason == REASON_WIFICOND_CRASH)) {Log.e(TAG, "Invalid trigger reason. Ignoring...");return;}Log.e(TAG, "Triggering recovery for reason: " + REASON_STRINGS[reason]);if (reason == REASON_WIFICOND_CRASH || reason == REASON_HAL_CRASH) {trimPastRestartTimes();// Ensure there haven't been too many restarts within MAX_RESTARTS_TIME_WINDOWif (mPastRestartTimes.size() >= MAX_RESTARTS_IN_TIME_WINDOW) {Log.e(TAG, "Already restarted wifi (" + MAX_RESTARTS_IN_TIME_WINDOW + ") times in"+ " last (" + MAX_RESTARTS_TIME_WINDOW_MILLIS + "ms ). Ignoring...");return;}mPastRestartTimes.add(mClock.getElapsedSinceBootMillis());}mWifiController.sendMessage(WifiController.CMD_RESTART_WIFI);}/*** Process the mPastRestartTimes list, removing elements outside the max restarts time window*/private void trimPastRestartTimes() {Iterator iter = mPastRestartTimes.iterator();long now = mClock.getElapsedSinceBootMillis();while (iter.hasNext()) {Long restartTimeMillis = iter.next();if (now - restartTimeMillis > MAX_RESTARTS_TIME_WINDOW_MILLIS) {iter.remove();} else {break;}}}

1)首先判断是否是已知的重启原因,若不是,忽略

2)若是wificond/hal crash,那么在指定时间内重启次数有限制,具体为1小时内重启次数不能超过2次。

public static final long MAX_RESTARTS_IN_TIME_WINDOW = 2; // 2 restarts per hourpublic static final long MAX_RESTARTS_TIME_WINDOW_MILLIS = 60 * 60 * 1000; // 1 hour

3)发送CMD_RESTART_WIFI命令给WifiController触发重启

 

2.2 WifiController

 


推荐阅读
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 本文介绍了MVP架构模式及其在国庆技术博客中的应用。MVP架构模式是一种演变自MVC架构的新模式,其中View和Model之间的通信通过Presenter进行。相比MVC架构,MVP架构将交互逻辑放在Presenter内部,而View直接从Model中读取数据而不是通过Controller。本文还探讨了MVP架构在国庆技术博客中的具体应用。 ... [详细]
author-avatar
梦一直在延续
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有