平台 | 内核版本 | 安卓版本 |
---|---|---|
RK3399 | Linux4.4 | Android7.1 |
文章目录
介绍
Android
的 Settings
应用程序对WiFi
的使用,是典型的 WiFi
应用方
式,也是用户可见的 Android WiFi
管理程序。
流程分析
目录:packages/apps/Settings/src/com/android/settings/wifi
文件:WifiSettings.java
和WifiEnabler.java
用户在设置界面开启 WiFi
,调用 Settings
应用程序的 WifiEnabler.setWifiEnabled
,然后调用WifiManager.setWifiEnabled
。
看一下WifiSettings.java
:
设置这边说到底其实就是监控WiFi
开关的变化,然后根据开关走对应的逻辑处理。
两个比较重要的类:
1)WifiSettings
:设置中wifi
主界面所对应的代码
2)WifiEnabler
:设置中负责wifi
开关打开和关闭事件处理的类
在wifisettings activity
的onStart
函数中,创建一个WifiEnabler
对象,用于实现wifi
开关功能。
private WifiEnabler mWifiEnabler;
重点分析下createWifiEnadbler
onStart
会调用createWifiEnadbler
1、activity
packages/apps/Settings/src/com/android/settings/SettingsActivity.java
看看getSwitchBar
2、WifiEnabler
WifiEnabler.java
中
这个里面做了两步:
2.1、:WifiManager
给应用层使用:
首先看下SystemServer
有关wifi
的有哪些:
目录:frameworks/base/services/java/com/android/server/SystemServer.java
获得WIFI_SERVICE
mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
2.2、setupSwitchBar
这里是调用前面的启动监听将mListeningToOnSwitchChange
设为true
,这样当我们点击wifi
开关按钮的时候就会调用前面的onSwitchChanged
随即调用mListener.onSwitchToggled(isChecked)
;
最终会调用到WifiEnabler.java
中的handleWifiStateChanged
看一下WifiEnabler.java
中的onSwitchChanged
WifiManager.setWifiEnabled
通过Binder
机制调用 WifiService.setWifiEnabled
。这里的 WifiService
也就是WiFi
的 Java
层的内容。
3、 WifiService.setWifiEnabled
分析:
其实WiFiManager
使用aidl
方式和WifiService
进行通信frameworks/base/wifi/java/android/net/wifi/IWifiManager.aidl
boolean setWifiEnabled(String packageName, boolean enable);
通过AIDL
方式,在Android7.1中,实际调用的是WifiServiceImpl::setWifiEnabled(boolean enable)
目录:frameworks/base/wifi/java/android/net/wifi/WifiManager.java
最终调用的的是WifiServiceImpl
中的setWifiEnabled
方法:
目录:frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiServiceImpl.java
WifiServiceImpl
中实现WifiService
的方法,像WifiController
发消息:CMD_WIFI_TOGGLED
操作使能开关是的日志如下:
从代码可以看出,这里主要的操作是将wifi
是否enable
的状态存入数据库、向WiFiController
发送了CMD_WIFI_TOGGLED
消息。
WifiController
状态机的创建、开启工作在WifiServiceImpl
中完成这个状态稍后介绍
《WifiController状态机》-待写
《WifiStateMachine状态机》-待写```````
由StateMachine
的知识可知,转换到某个状态时,会依次调用父、子状态的enter()
函数。最终调用如下:
目录:frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiStateMachine.java
最终会调用到:
目录:frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiConnectivityManager.java
操作wifi
后的打印日志如下:
看一下对应的函数:
扫描: