Android 9.0 WiFi 扫描结果上报和获取流程

简介: Android 9.0 WiFi 扫描结果上报和获取流程

本文是对wifi扫描结果上报和获取过程的java层代码流程梳理总结。


我们先分析扫描成功的上报和获取过程。

一、WiFi扫描成功的上报和获取过程


WiFi扫描成功的上报和获取大致是由三条不连贯流程组成的,分别是通知framework和WifiTracker获取扫描结果以及应用主动获取扫描结果。


1.framework获取保存扫描结果。大致的流程为:WificondControl-->WifiMonitor--> WificondScannerImpl-->WifiNative;


2.WifiTracker获取和保存扫描结果。大致的流程为:WificondControl-->WifiMonitor--> WificondScannerImpl-->WifiNative;


3.Settings应用获取扫描结果


下面我们看下代码的具体流程:


1 framework获取保存扫描结果

WificondControl.java


WifiMonitor.java


WificondScannerImpl.java


进入pollLatestScanData();



通过mWifiNative.getScanResults来从底层获取wifi扫描结果。

WifiNative.java

最后调用scannerImpl.getScanResults()从底层获扫描取数据。


2、WifiTracker获取和保存扫描结果

ScanRequestProxy.java


onResults()是底层完成扫描后的上报;


发送广播SCAN_RESULTS_AVAILABLE_ACTION通知WifiTracker扫描结果可获取


WifiTracker获取扫描数据


WifiTracker在这里接收到扫描结果获取的广播WifiManager.SCAN_RESULTS_AVAILABLE_ACTION

 


这里调用了mWifiManager.getScanResults()获取扫描数据,然后调用updateAccessPoints(newScanResults, configs)刷新缓存的扫描数据;


packages\modules\Wifi\framework\java\android\net\wifi\WifiManager.java

WifiManager.java



service是IWifiManager 类型的aidl文件,具体实现在packages\modules\Wifi\service\java\com\android\server\wifi\BaseWifiService.java


IWifiManager mService;
public class BaseWifiService extends IWifiManager.Stub {


具体实现在packages\modules\Wifi\service\java\com\android\server\wifi\WifiServiceImpl.java

WifiServiceImpl.java


ScanRequestProxy.java


这里看看mLastScanResults怎么来的。


这里可以看到mLastScanResults就是ScanRequestProxy在发送广播时赋值的。所以WifiTracker获取的扫描数据是framwork缓存的值。


WifiTracker缓存扫描数据


这个mInternalAccessPoints会在5.3中用到的。


3、Settings应用获取扫描结果

在生命周期函数onStart()处理Wifi的状态;


这里的mInternalAccessPoints 则是在WifiTracker保存的。

二、扫描失败结果上报

前面只分析了扫描成功后的结果的上报,这里再分析下扫描失败部分的上报流程。扫描命令下发失败、扫描过程中失败,扫描结果获取超时。

1 扫描命令下发失败。

WifiServiceImpl.java


这里调用了runWithScissonrs()。这是一个同步等待其他线程handler的执行的方法,超时后就会返回false。


这里如果超时就返回false就发送广播sendFailedScanBroadcast(),通知扫描失败。


再看下scanSuccess.value结果。


ScanRequestProxy.java

 


这里再一次进行了扫描之前的判断并发送广播通知扫描失败。下面继续跟踪扫描的方法走。



这里的方法中通过replyFailed()通知扫描失败。



WifiScanner.java


这里移除对应的listener,如果是failed,就回调listener的onFailure方法,将失败原因和描述传递打印出来。

ScanRequestProxy.java


后面就进入WificondScannerImpl中的startSingleScan().

2 扫描过程中失败

WificondScannerImpl.java


方法中对mWifiNative.scan()的返回结果做了处理,


handleScanTimeout()方法是当下发扫描命令成功后会设立一个15s的倒计时,若15s没有失败或者成功上报就会上报一个失败,最终触发广播通知


3 扫描结果获取失败

WificondControl.java,


WificondScannerImpl.java


目录
相关文章
|
2月前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
80 15
Android 系统缓存扫描与清理方法分析
|
2月前
|
Android开发
Android面试之Activity启动流程简述
Android面试之Activity启动流程简述
94 6
|
2月前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
|
2月前
|
消息中间件 Android开发 索引
Android面试高频知识点(4) 详解Activity的启动流程
Android面试高频知识点(4) 详解Activity的启动流程
31 3
|
2月前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
27 2
|
2月前
|
XML 前端开发 Android开发
Android View的绘制流程和原理详细解说
Android View的绘制流程和原理详细解说
48 3
|
2月前
|
Android开发
Android面试之Activity启动流程简述
Android面试之Activity启动流程简述
20 0
|
3月前
|
消息中间件 Android开发 索引
Android面试高频知识点(4) 详解Activity的启动流程
讲解Activity的启动流程了,Activity的启动流程相对复杂一下,涉及到了Activity中的生命周期方法,涉及到了Android体系的CS模式,涉及到了Android中进程通讯Binder机制等等, 首先介绍一下Activity,这里引用一下Android guide中对Activity的介绍:
59 4
|
3月前
|
Android开发 开发者
Android面试之Activity启动流程简述
每个Android开发者都熟悉的Activity,但你是否了解它的启动流程呢?本文将带你深入了解。启动流程涉及四个关键角色:Launcher进程、SystemServer的AMS、应用程序的ActivityThread及Zygote进程。核心在于AMS与ActivityThread间的通信。文章详细解析了从Launcher启动Activity的过程,包括通过AIDL获取AMS、Zygote进程启动以及ActivityThread与AMS的通信机制。接着介绍了如何创建Application及Activity的具体步骤。整体流程清晰明了,帮助你更深入理解Activity的工作原理。
59 0
|
4月前
|
Android开发
我的Android进阶修炼:安卓启动流程之init(1)
本文深入分析了Android系统中的init进程,包括其源码结构、主要功能以及启动流程的详细注解,旨在帮助读者理解init作为用户空间的1号进程在Android启动过程中的关键作用。
94 1