1. 前言:
- Android 4.4 原生Settings代码路径: android-4.4.4/packages/apps/Settings.
- 代码架构: 相对简单, 没有按照MVC, 或者MVP的形式来规划源码架构, 所以很多做系统开发的开发者很难聚焦来看源码的实现.
2. Android 4.4 WiFi 部分的源码解析:
2.1 WIFI 模块整体的功能结构:
- 开启 WiFi
- 关闭 WiFi
- 获取 WiFi 列表
- 持续扫描 WiFi ap.
- 连接网络
- 忘记网络
- 添加网络
- 网络高级设置等.
2.2 WiFi 整体功能示意图:
2.3 WiFi 功能的主承载体:
- WifiSettings.java, 本质是继承自 PreferenceFragment , 其路径: com.android.settings.wifi
- 对于安卓网络广播的处理, 也是在此类中, 在创建Fragment对象的时候, 进行了一些列的初始化, 其中包含接收广播的ACTION, 接收ACTION后对其处理的函数handleEvent(context, intent):
- Scanner类: 集成自Handler的一个Object类, 是WifiSettings的一个内部类, 负责在WiFi状态开启时, 调度自身进行扫描WiFi的任务轮询, 并且暴露出 resume(), forceScan(), pause() 的函数.
- 其中:
- resume() 是发消息给自身, 来执行扫描的操作.
- forceScan(), 强制扫描, 移除原有消息队列中的任务, 发送新的任务, 强制重新扫描.
- pause(), 是移除自身扫描任务的消息, 退出扫描轮询操作.
2.4 生命周期函数及部分回调函数的处理:
- onCreateView 中做了部分初始化. 如subMenu的一些处理, 添加网络, 高级设置等.
- onActivityCreate 中做了如下相关的参数初始化.
- a. 初始化WiFi管理类, WifiManager.
- b. 初始化连接, 保存, 忘记网络的回调初始化. ActionListener.
- c. wifi 开关, 及动态侦测WiFi状态的辅助类的初始化.
- onResume 中, 注册了WiFi状态的监听广播, 和WiFi列表及热点变更,网络状态的广播. 并更新当前 ap.
-
onPause 中, 解除了onResume函数中注册的相关广播. 并且移除掉了扫描任务. (可以理解为, 释放资源, 避免内存泄漏.)
-
onCreateOptionsMenu 中, 则初始化, 添加了一些高级设置, 辅助WiFi的操作控件. 如下:
- onOptionsMenuSelected 中, 针对上述添加的控件, 做了一些特定的响应, 根据其itemId 来区分, 当前操作的是哪个具体的菜单.
- onCreateContextMenu 中, 针对当前每一个WiFi列表中的, WiFi 网络, 添加了一些条目处理. 如果是未保存的网络, 则赋予其连接的动作. 如果是已保存网络, 则赋予其忘记网络, 修改网络的动作.
- onOptionsItemSelected 中, 针对选项操作菜单中的各个条目进行一些列的UI 或 WiFi 操作处理.
- onPreferenceTreeClick, 其实相当于是ListView 的 onItemClickListener 的回调方法, 在Preference 列表中, 是对各条目点击操作的回调函数, 其中, 对于当前网络的连接的处理. 对于未保存, 无密码的, 直接连接, 否则弹框让用户键入用户密码后, 进行保存, 或连接.
2.5 关于 WIFI 刷新的那些事儿:
- 之前提到的最重要的, 关于网络广播的回调及监听, 在handleEvent中做了处理, 包括更新当前WiFi列表, 刷新网络数据结构. (AccessPoint) 等, 均是此处接收到原生广播后, 进行的统一处理.
- 关于刷新的那些事儿: 根据接收安卓系统广播, 通过刷新数据, 进而开始刷新UI, 更新每个 preference 条目的热点数据结构完成.
- 通过监听 WiFi 状态变化, (相关的ACTION: WifiManager.WIFI_STATE_CHANGED_ACTION) 更新 optionsMenu, 其实, 根据WiFi状态改变, 决定是否扫描. 相关的调用比较简单. 见图:
- 通过监听底层扫描, 网络配置变化, (相关的ACTION: WifiManager.SCAN_RESULTS_AVAILABLE_ACTION, WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION, WifiManager.LINK_CONFIGURATION_CHANGED_ACTION) 来更新 AccessPoint 数据结构, 进而更新每个 preference 持有的 accessPoint, 相当于更新 ListView / RecyclerView 中itemView 的Tag. 相关的更新如下图所示: (4.4 的做法, 是移除所有的 preference 容器中的所有 UI, 然后重新初始化, 没做缓存).
- 通过监听WiFi请求状态的变化, (相关的ACTION: WifiManager.SUPPLICANT_STATE_CHANGED_ACTION) 来更新网络连接状态, 更新每个条目中的 DetailedState 来刷新每个条目持有的accessPoint.
- 通过网络变化, (相关的ACTION: WifiManager.NETWORK_STATE_CHANGED_ACTION) 刷新热点, 更新连接状态. 相关代码如下:
- 通过监听网络信号变化, (相关的ACTION: WifiManager.RSSI_CHANGED_ACTION) 刷新条目状态.
3. 小结:
- 如上, 针对原生 Android Settings源代码, 结合自身阅读源码的一些经验和见解, 形成了如上文档作为归结, 其一, 对源码的理解会加深印象, 后期有疑问可快速查询定位, 其二, 希望能对刚踏入系统开发者兄弟做一些入门指导. 如上, 感谢~~~
- 如文章中有不合适之处, 或有疑问, 请简信, 或邮箱告知. 亦可下方评论区留言.
- qq 邮箱: 1281641968@qq.com