下周三要做内部培训

这里先走读 WakeupController 完成对Android R WIFI重连场景的代码走读覆盖

可以设想这样一种场景:
用户手机wifi关闭,回到家自动打开并连接上家里的wifi
我们把这个流程代码走读一遍

WakeupController

先看注释

/*** WakeupController is responsible managing Auto Wifi.** <p>It determines if and when to re-enable wifi after it has been turned off by the user.*/

WakeupController 同样是在 WifiInjector 中被构造
在 ClientModeManager 中有个内部HSM
在进入 ScanOnlyModeState 后,WakeupController.start()
在退出 ScanOnlyModeState 时,WakeupController.stop()
至于 ClientModeManager , 以后再看

static final long LAST_DISCONNECT_TIMEOUT_MILLIS = 5 * 1000;public void start() {// 没有高品质网络的话直接 return 掉if (getGoodSavedNetworksAndSuggestions().isEmpty()) {return;}mWifiInjector.getWifiScanner().registerScanListener(new HandlerExecutor(mHandler), mScanListener);setActive(true);if (isEnabledAndReady()) {mWakeupOnboarding.maybeShowNotification();List<ScanResult> scanResults =filterDfsScanResults(mWifiInjector.getWifiScanner().getSingleScanResults());Set<ScanResultMatchInfo> matchInfos = toMatchInfos(scanResults);matchInfos.retainAll(getGoodSavedNetworksAndSuggestions());// 需要保证将上次断开的网络加到 wakeup lock中// 因为我们不想重连这个网络// 这里的限制是 5s 内long now = mClock.getElapsedSinceBootMillis();if (mLastDisconnectInfo != null && ((now - mLastDisconnectTimestampMillis)<= LAST_DISCONNECT_TIMEOUT_MILLIS)) {matchInfos.add(mLastDisconnectInfo);}mWakeupLock.setLock(matchInfos);}
}

handleScreenStateChanged

用户打开手机亮屏

handleScreenStateChanged 在 ClientModeImpl 的 handleScreenStateChanged 被调用
因为收到亮屏广播被调用

/** 亮屏时,有 goodNetworks 的话,每隔10s进行一次扫描* 灭屏时,不进行扫描*/
public void handleScreenStateChanged(boolean screenOn) {if(screenOn){if(mScanThread != null){mScanThread.interrupt();}// 没有 goodNetworks 的话不会进行扫描Set<ScanResultMatchInfo> goodNetworks = getGoodSavedNetworksAndSuggestions();if(goodNetworks == null || goodNetworks.size() == 0 ){Log.d(TAG, "no scan due to no valid saved network");return;}// 每10s进行一次扫描,最多进行进行10次mScanThread = new Thread(){@Overridepublic void run() {try{int count = 0;while(!isInterrupted() && count < 100){if(count == 0 || count % 10 == 0){startScheduledScan();}Thread.sleep(1_000);count ++;}}}};mScanThread.start();}else{stopScheduledScan();}
}

handleScanResults

/** The controller updates the WakeupLock with the incoming scan results* If WakeupLock is not yet fully initialized, it adds the current scanResults to the lock and returns* If WakeupLock is initialized but not empty, the controller updates the lock with the current scan* If it is both initialized and empty, it evaluates scan results for a match with saved networks* If a match exists, it enables wifi*/
private void handleScanResults(Collection<ScanResult> scanResults) {mNumScansHandled++;// need to show notification here in case user turns phone on while wifi is off// 弹出一个通知告知用户wifi将自动打开mWakeupOnboarding.maybeShowNotification();// filter out unknown networksSet<ScanResultMatchInfo> goodNetworks = getGoodSavedNetworksAndSuggestions();Set<ScanResultMatchInfo> matchInfos = toMatchInfos(scanResults);matchInfos.retainAll(goodNetworks);mWakeupLock.update(matchInfos);if (!mWakeupLock.isUnlocked()) {return;}ScanResult network = mWakeupEvaluator.findViableNetwork(scanResults, goodNetworks);if (network != null) {enableWifi();}
}

WakeupController 走读相关推荐

  1. Apache Spark源码走读之8 -- Spark on Yarn

    欢迎转载,转载请注明出处,徽沪一郎. 概要 Hadoop2中的Yarn是一个分布式计算资源的管理平台,由于其有极好的模型抽象,非常有可能成为分布式计算资源管理的事实标准.其主要职责将是分布式计算集群的 ...

  2. Apache Spark源码走读之16 -- spark repl实现详解

    欢迎转载,转载请注明出处,徽沪一郎. 概要 之所以对spark shell的内部实现产生兴趣全部缘于好奇代码的编译加载过程,scala是需要编译才能执行的语言,但提供的scala repl可以实现代码 ...

  3. Golang heap源码简单走读

    golang heap小根堆源码走读 heap概览 在golang中,通过heap给出了一个实现小根堆的接口. type Interface interface {sort.InterfacePush ...

  4. spark on yarn yarn-client模式实现源码走读

    Spark版本2.4.0 在SparkContext的初始化过程中,将会根据配置的启动模式来选择不同的任务调度器TaskScheduler,而这个不同模式的实现也是在这里根据选择的TaskSchedu ...

  5. 操作系统下代码设计与走读方法—业务线索法

    前言 个人总结,阅读代码有以下4大线索: 1.线程线 :线程线索的简称,观察创建了多少个线程,以线程运行流程的角度理解程序. 2.数据线 :数据结构线索的简称,观察创建了多少个全局变量或对象,以数据流 ...

  6. 95-230-026-源码-WordCount走读-本地运行SubmitJob的过程

    1.视界 2. 概述 3. 前文回顾 在前面 WordCount走读-获取JobGraph.md 中讲解了如何获取JobGraph,下面是继续执行 org.apache.flink.streaming ...

  7. 高中生住校好还是走读好?为什么?

    我比较支持走读,反对住校.我儿子高中离家特别远,我们是选择了陪读.我反对住校是因为我是从初中到大学都是住校的,可以说深知住宿的危害.所以如果条件允许,尽量让孩子选择走读,甚至是陪读. 很多人提出了住宿 ...

  8. Google Volley框架源码走读

      PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanb ...

  9. Apache Spark源码走读之22 -- 浅谈mllib中线性回归的算法实现

    欢迎转载,转载请注明出处,徽沪一郎. 概要 本文简要描述线性回归算法在Spark MLLib中的具体实现,涉及线性回归算法本身及线性回归并行处理的理论基础,然后对代码实现部分进行走读. 线性回归模型 ...

最新文章

  1. 天津市职高高一计算机试题及答案,职高(中职)数学(基础模块)上册题库.doc
  2. 搞多媒体开发?吴威麒:先拉个书单看看
  3. PDF密码去除常用工具
  4. 内存泄漏——内存溢出区别
  5. uC/OS 的任务调度解析
  6. C/C++通过WMI和系统API函数获取获取系统硬件配置信息(转)
  7. 百度小程序-swiper组件
  8. 稳定不掉线,翀旭用飞鱼星解决高密Wi-Fi接入
  9. 学习ARM64页表转换流程
  10. 5-17 汉诺塔的非递归实现 (25分)
  11. expandable长点击的实现
  12. BUG: Bad page map in process XXX pte:800000036fae6227 pmd:35be8c067
  13. Python什么都能做(二)用Python画微信新出的表情包
  14. UMA Frame Buffer Size 核显显存与CSGO帧率
  15. 2020年Java就业前景和就业方向分析!
  16. 富兰克林的风筝实验中的秘密
  17. Java基础学习—— IO流
  18. Unity:DOTween来回运行或者缩放等LoopType.Yoyo
  19. 大数据项目学习(一)
  20. BFF——服务于前端的后端

热门文章

  1. win10怎么用计算机算进制,Win10系统计算器如何转换进制-win10系统下各进制转换的方法 - 河东软件园...
  2. HAL库教程3:引脚输入检测
  3. 本人地推行业摸爬滚打5年
  4. JAVA通用分页代码
  5. 从零开始的Java再学习-DAY10
  6. 为什么有人说富坚义博有着殿堂级的画功?他的画功体现在哪儿呢?
  7. 数学测试卷软件,小学数学练习机_随机出数学练习题软件 50.0官方版
  8. linux mysql添加视图_Linux下MySQL的简单使用(二)
  9. 在华为手机上玩OPPO游戏
  10. 《皮肤的秘密》 读书笔记