Android-WiFi开发之 Android 4.4 代码解析.

1. 前言:

  • Android 4.4 原生Settings代码路径: android-4.4.4/packages/apps/Settings.
  • 代码架构: 相对简单, 没有按照MVC, 或者MVP的形式来规划源码架构, 所以很多做系统开发的开发者很难聚焦来看源码的实现.

2. Android 4.4 WiFi 部分的源码解析:

2.1 WIFI 模块整体的功能结构:

  1. 开启 WiFi
  2. 关闭 WiFi
  3. 获取 WiFi 列表
  4. 持续扫描 WiFi ap.
  5. 连接网络
  6. 忘记网络
  7. 添加网络
  8. 网络高级设置等.

2.2 WiFi 整体功能示意图:

image.png

2.3 WiFi 功能的主承载体:

image.png
  • WifiSettings.java, 本质是继承自 PreferenceFragment , 其路径: com.android.settings.wifi
  • 对于安卓网络广播的处理, 也是在此类中, 在创建Fragment对象的时候, 进行了一些列的初始化, 其中包含接收广播的ACTION, 接收ACTION后对其处理的函数handleEvent(context, intent):
image.png
  • Scanner类: 集成自Handler的一个Object类, 是WifiSettings的一个内部类, 负责在WiFi状态开启时, 调度自身进行扫描WiFi的任务轮询, 并且暴露出 resume(), forceScan(), pause() 的函数.
  • 其中:
    • resume() 是发消息给自身, 来执行扫描的操作.
    • forceScan(), 强制扫描, 移除原有消息队列中的任务, 发送新的任务, 强制重新扫描.
    • pause(), 是移除自身扫描任务的消息, 退出扫描轮询操作.
image.png

2.4 生命周期函数及部分回调函数的处理:

  • onCreateView 中做了部分初始化. 如subMenu的一些处理, 添加网络, 高级设置等.
image.png
  • onActivityCreate 中做了如下相关的参数初始化.
    • a. 初始化WiFi管理类, WifiManager.
    • b. 初始化连接, 保存, 忘记网络的回调初始化. ActionListener.
    • c. wifi 开关, 及动态侦测WiFi状态的辅助类的初始化.
image.png
image.png
image.png
  • onResume 中, 注册了WiFi状态的监听广播, 和WiFi列表及热点变更,网络状态的广播. 并更新当前 ap.
image.png
  • onPause 中, 解除了onResume函数中注册的相关广播. 并且移除掉了扫描任务. (可以理解为, 释放资源, 避免内存泄漏.)


    image.png
  • onCreateOptionsMenu 中, 则初始化, 添加了一些高级设置, 辅助WiFi的操作控件. 如下:


    image.png
  • onOptionsMenuSelected 中, 针对上述添加的控件, 做了一些特定的响应, 根据其itemId 来区分, 当前操作的是哪个具体的菜单.
image.png
  • onCreateContextMenu 中, 针对当前每一个WiFi列表中的, WiFi 网络, 添加了一些条目处理. 如果是未保存的网络, 则赋予其连接的动作. 如果是已保存网络, 则赋予其忘记网络, 修改网络的动作.
image.png
  • onOptionsItemSelected 中, 针对选项操作菜单中的各个条目进行一些列的UI 或 WiFi 操作处理.
image.png
  • onPreferenceTreeClick, 其实相当于是ListView 的 onItemClickListener 的回调方法, 在Preference 列表中, 是对各条目点击操作的回调函数, 其中, 对于当前网络的连接的处理. 对于未保存, 无密码的, 直接连接, 否则弹框让用户键入用户密码后, 进行保存, 或连接.
image.png

2.5 关于 WIFI 刷新的那些事儿:

  • 之前提到的最重要的, 关于网络广播的回调及监听, 在handleEvent中做了处理, 包括更新当前WiFi列表, 刷新网络数据结构. (AccessPoint) 等, 均是此处接收到原生广播后, 进行的统一处理.
image.png
  • 关于刷新的那些事儿: 根据接收安卓系统广播, 通过刷新数据, 进而开始刷新UI, 更新每个 preference 条目的热点数据结构完成.
  • 通过监听 WiFi 状态变化, (相关的ACTION: WifiManager.WIFI_STATE_CHANGED_ACTION) 更新 optionsMenu, 其实, 根据WiFi状态改变, 决定是否扫描. 相关的调用比较简单. 见图:
image.png
  • 通过监听底层扫描, 网络配置变化, (相关的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, 然后重新初始化, 没做缓存).
image.png
  • 通过监听WiFi请求状态的变化, (相关的ACTION: WifiManager.SUPPLICANT_STATE_CHANGED_ACTION) 来更新网络连接状态, 更新每个条目中的 DetailedState 来刷新每个条目持有的accessPoint.
image.png
  • 通过网络变化, (相关的ACTION: WifiManager.NETWORK_STATE_CHANGED_ACTION) 刷新热点, 更新连接状态. 相关代码如下:
image.png
  • 通过监听网络信号变化, (相关的ACTION: WifiManager.RSSI_CHANGED_ACTION) 刷新条目状态.
image.png

3. 小结:

  1. 如上, 针对原生 Android Settings源代码, 结合自身阅读源码的一些经验和见解, 形成了如上文档作为归结, 其一, 对源码的理解会加深印象, 后期有疑问可快速查询定位, 其二, 希望能对刚踏入系统开发者兄弟做一些入门指导. 如上, 感谢~~~
  2. 如文章中有不合适之处, 或有疑问, 请简信, 或邮箱告知. 亦可下方评论区留言.
  3. qq 邮箱: 1281641968@qq.com
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容