目录
2.1 Settings.Global.WIFI_SAVED_STATE
引述
我们在Android系统关开机之后会发现Wifi仍然保持着上一次关机时的状态,而且是进入home界面之后Wifi就会自动打开。我们就会想Wifi开关状态是保存在哪里呢?又是谁去打开Wifi的呢?是Settings应用呢还是在Launcher呢;下面我们就简单分析Wifi开关状态值的保存逻辑和开机后打开Wifi的流程。
我们程序员逻辑一般都是先考虑功能的实现。所以我们先分析开机后打开Wifi的流程,看下是如何去恢复上一次的Wifi状态。
一、开机后打开Wifi开关的流程
WifiService在开机时就会被启动起来,它是在SystemServer在startOtherServices() 方法中启动的;
然后再调用了startBootPhase();
最后来到WifiSerice中的onBootPhase();
接着调用了checkAndStartWifi();
方法中是先执行isWifiToggleEnabled()获取之前的状态,然后根据获取的mPersistWifiState值再判断是否去打开WIFI开关。
我们再跟一下mPersistWifiState这个值的来源。
这里我们就看到了状态值是调用Settings.Global来进行获取保存的。保存的key值是Settings.Global.WIFI_ON。.
这里先总结一下大致流程:
- 系统开机后SystemServer启动WifiService。
- WifiService执行checkAndStartWifi()来恢复上一次的Wifi开关状态。
- 如果获取到的会根据保存的Settings.Global.WIFI_SAVED_STATE和Settings.Global.WIFI_ON两个值来判断是否打开Wifi。
下面我们接下来再看下Settings.Global.WIFI_SAVED_STATE和Settings.Global.WIFI_ON这两个值的赋值流程。
二、Wifi开关状态值的保存逻辑
2.1 Settings.Global.WIFI_SAVED_STATE
这里的注释可以看出这个值用来当切换WiFi热点时保存相应当前Wifi状态。然后在开机后WifiService启动时读取使用它。
2.2 Settings.Global.WIFI_ON
我们直接全局搜索一下上面读取的这个key值Settings.Global.WIFI_ON。就会发现是在WifiSettingsStore这里类里面有调用。
我们再跟一下handleWifiToggled()这个方法,发现WifiServiceImpl里面有调用:
这里就看到了我们每次打开和关闭Wifi就会以Settings.Global.WIFI_ON为key值记录到系统中。下一次开机时启动WifiService再去读取这个值。
同时WakeupController中也有调用;
我们跟着enableWifi()继续走:
最后我们发现是在扫描的监听方法中onResults()中保存的Wifi状态值,到了这里我们就弄清了Wifi开关状态值的保存逻辑。
本篇分析到这里结束了,感谢您抽出宝贵的时间阅读本文,如有错误的地方欢迎提出一起讨论。