[RK3288][Android6.0] WiFi之与ConnectivityService的交互
来源:互联网 发布:北京矩阵联合营销顾问 编辑:程序博客网 时间:2024/05/17 08:31
Platform: Rockchip
OS: Android 6.0
Kernel: 3.10.92
在Wifi的整个过程中,有个函数一直会被调用到: setNetworkDetailedState(),它是用来和系统的ConnectivityService关联的,作用是为了告知系统当前wifi的状态,因为系统里存在多个网络,如有线网,数据上网等,像平常我们使用PC的时候,当有线网和wifi同时连着的时候,会优先选择wifi,Android系统的机制也是类似的。
因此wifi子模块通过setNetworkDetailedState()来告知系统当前连接状态以决定是否需要切换网络,而且同一时间只能有一个网络工作。
当断开wifi时,会调用
handleNetworkDisconnect -> setNetworkDetailedState(DetailedState.DISCONNECTED)
这时参数是DetailedState.DISCONNECTED
WifiStateMachine.java
private boolean setNetworkDetailedState(NetworkInfo.DetailedState state) { //新旧状态不一致时,要重新设置 if (state != mNetworkInfo.getDetailedState()) { //设置新的状态 mNetworkInfo.setDetailedState(state, null, mWifiInfo.getSSID()); if (mNetworkAgent != null) { //和ConnectivityService通信的关键部分,会把更新的mNetworkInfo信息发过去 mNetworkAgent.sendNetworkInfo(mNetworkInfo); } //广播网络状态变化: WifiManager.NETWORK_STATE_CHANGED_ACTION sendNetworkStateChangeBroadcast(null); return true; } return false;}
public void sendNetworkInfo(NetworkInfo networkInfo) { queueOrSendMessage(EVENT_NETWORK_INFO_CHANGED, new NetworkInfo(networkInfo));}
消息最终被ConnectivityService中的NetworkStateTrackerHandler处理
public void handleMessage(Message msg) { case NetworkAgent.EVENT_NETWORK_INFO_CHANGED: { NetworkAgentInfo nai = mNetworkAgentInfos.get(msg.replyTo); info = (NetworkInfo) msg.obj; updateNetworkInfo(nai, info); break; }}
updateNetworkInfo -> networkAgent.asyncChannel.disconnect -> handleMessage -> handleAsyncChannelDisconnected
private void handleAsyncChannelDisconnected(Message msg) // Remove all previously satisfied requests. for (int i = 0; i < nai.networkRequests.size(); i++) { NetworkRequest request = nai.networkRequests.valueAt(i); NetworkAgentInfo currentNetwork = mNetworkForRequestId.get(request.requestId); //移除当前要断开的网络 if (currentNetwork != null && currentNetwork.network.netId == nai.network.netId) { mNetworkForRequestId.remove(request.requestId); //系统的连接的优先级是通过score来评判的,更新score sendUpdatedScoreToFactories(request, 0); } }}
参考:
Framework中的连接管理机制(原)
阅读全文
1 0
- [RK3288][Android6.0] WiFi之与ConnectivityService的交互
- [RK3288][Android6.0] WiFi之Framework的socket(客户端)
- [RK3288][Android6.0] WiFi之wpa_supplicant的socket(服务端)
- [RK3288][Android6.0] WiFi之无线网络配置的保存过程
- [RK3288][Android6.0] WiFi之无线网络配置的断开过程
- [RK3288][Android6.0] WiFi之无线网络配置的关闭过程
- [RK3288][Android6.0] WiFi之NetworkFactory形成的评分机制
- [RK3288][Android6.0] WiFi之NetworkAgent对评分的更新
- [RK3288][Android6.0] WiFi之wpa_supplicant与内核通信的socket
- [RK3288][Android6.0] WiFi之WifiWatchdogStateMachine
- [RK3288][Android6.0] WiFi之wpa_supplicant服务启动
- [RK3288][Android6.0] WiFi之wpa_supplicant初始化过程
- [RK3288][Android6.0] WiFi之wpa_supplicant扫描过程
- [RK3288][Android6.0] WiFi之Framework扫描过程
- [RK3288][Android6.0] WiFi之Framework连接过程小结
- [RK3288][Android6.0] WiFi之开机自动连接过程
- [RK3288][Android6.0] WiFi之Passpoint功能了解
- [RK3288][Android6.0] WiFi之PNO功能了解
- (卡特兰数,二叉树数量)How Many Trees? &&Count the Trees -- HDOJ
- archive 生成的ipa 比 bulid然后拖到itunes里生成的ipa要小7、8M
- fio使用(windows+linux)
- 【Java】编程过程中遇到的中文编码问题
- Hdu 1671 -Phone List (字典树模板)
- [RK3288][Android6.0] WiFi之与ConnectivityService的交互
- 开发中遇见的问题汇总
- Java中如何遍历Map对象的4种方法
- C++中的string 类 简单介绍
- 'autocomplete="off"'在Chrome中不起作用解决方案
- 基于redis的抽奖解决方案
- jQuery ajax
- fflush
- 虚拟现实产业呈五大发展趋势