Android -- Wifi的断开及关闭流程简介

Android/安卓开发之WIFI的基本应用 本文没有涉及到连接WIFI之后进行通讯,若有这方面的想法(例如两个客户端连接至同一WIFI后进行通讯),请关注后续文章一起讨论。 其实关于WIFI的开发的文章也非常的多,但是大部分只是简单的例子,不够全面,我这里是想写一个比较完整的WIFI应用,主要功能: 1.能够打开/关闭WIFI 2.能够扫面wifi并获取扫描结果 3.能够连接wifi,无论是什么加密方式 4.能够监听连接状态,如正... 阅读详情

Android -- Wifi的断开及关闭流程简介


当我们连接上一个AP时,Wifi的断开及关闭都会导致设备与AP之间的连接中断;关闭Wifi同时会导致Wifi断开。下面就简单介绍Wifi断开及关闭的流程。

一、Wifi的断开


我们断开Wifi,调用WifiManager::disconnect()方法,嵌套调用WifiServiceImpl的同名方法:
    /**
     * see {@link android.net.wifi.WifiManager#disconnect()}
     */
    public void disconnect() {
        enforceChangePermission();
        mWifiStateMachine.disconnectCommand();
    }
调用Wifi状态机的内部方法,发送断开Wifi的指令CMD_DISCONNECT。由于之前网络连接成功时,State Machine停在ConnectedState,所以由它的父状态L2ConnectedState处理该消息:
                case CMD_DISCONNECT:
                    mWifiNative.disconnect();
                    transitionTo(mDisconnectingState);
                    break;
通过WifiNative::disconnect()方法下发断开指令,当驱动断开AP连接后,wpa_s反馈断开事件,WifiMonitor接收来自wpa_s的event,并向WifiStateMachine反馈NETWORK_DISCONNECTION_EVENT消息(该过程参考前面的博文)。

切换到DisconnectingState状态,断开的消息尤其父状态ConnectModeState处理:
case WifiMonitor.NETWORK_DISCONNECTION_EVENT:
                    // Calling handleNetworkDisconnect here is redundant because we might already
                    // have called it when leaving L2ConnectedState to go to disconnecting state
                    // or thru other path
                    // We should normally check the mWifiInfo or mLastNetworkId so as to check
                    // if they are valid, and only in this case call handleNEtworkDisconnect,
                    // TODO: this should be fixed for a L MR release
                    // The side effect of calling handleNetworkDisconnect twice is that a bunch of
                    // idempotent commands are executed twice (stopping Dhcp, enabling the SPS mode
                    // at the chip etc...
                    if (DBG) log("ConnectModeState: Network connection lost ");
                    handleNetworkDisconnect();
                    transitionTo(mDisconnectedState);
                    break;
由代码中的注释可知,我们或许会在别的地方已经调用过handleNetworkDisconnect(),事实也确实如此;当我们离开L2ConnectedState状态时,会调用它的exit()方法:
       @Override
        public void exit() {
            if (mIpReachabilityMonitor != null) {
                mIpReachabilityMonitor.stop();
                mIpReachabilityMonitor = null;
            }

            // This is handled by receiving a NETWORK_DISCONNECTION_EVENT in ConnectModeState
            // Bug: 15347363
            // For paranoia's sake, call handleNetworkDisconnect
            // only if BSSID is null or last networkId
            // is not invalid.
            if (DBG) {
                StringBuilder sb = new StringBuilder();
                sb.append("leaving L2ConnectedState state nid=" + Integer.toString(mLastNetworkId));
                if (mLastBssid !=null) {
                    sb.append(" ").append(mLastBssid);
                }
            }
            if (mLastBssid != null || mLastNetworkId != WifiConfiguration.INVALID_NETWORK_ID) {
                handleNetworkDisconnect();//call the function,执行忘了断开时的处理
            }
        }
我们发现该方法中确实可能会调用handleNetworkDisconnect(),接着看该函数做了哪些处理:
/**
     * Resets the Wi-Fi Connections by clearing any state, resetting any sockets
     * using the interface, stopping DHCP & disabling interface
     */
    private void handleNetworkDisconnect() {

        clearCurrentConfigBSSID("handleNetworkDisconnect");

        stopDhcp();

        try {
            mNwService.clearInterfaceAddresses(mInterfaceName);
            mNwService.disableIpv6(mInterfaceName);
        } catch (Exception e) {
            loge("Failed to clear addresses or disable ipv6" + e);
        }

        /* Reset data structures */
        mBadLinkspeedcount = 0;
        mWifiInfo.reset();
        linkDebouncing = false;
        /* Reset roaming parameters */
        mAutoRoaming = WifiAutoJoinController.AUTO_JOIN_IDLE;

        /**
         *  fullBandConnectedTimeIntervalMilli:
         *  - start scans at mWifiConfigStore.wifiAssociatedShortScanIntervalMilli seconds interval
         *  - exponentially increase to mWifiConfigStore.associatedFullScanMaxIntervalMilli
         *  Initialize to sane value = 20 seconds
         */
        fullBandConnectedTimeIntervalMilli = 20 * 1000;

        setNetworkDetailedState(DetailedState.DISCONNECTED);
        if (mNetworkAgent != null) {
            mNetworkAgent.sendNetworkInfo(mNetworkInfo);
            mNetworkAgent = null;
        }
        mWifiConfigStore.updateStatus(mLastNetworkId, DetailedState.DISCONNECTED);

        /* Clear network properties */
        clearLinkProperties();

        /* Cend event to CM & network change broadcast */
        sendNetworkStateChangeBroadcast(mLastBssid);

        /* Cancel auto roam requests */
        autoRoamSetBSSID(mLastNetworkId, "any");

        mLastBssid = null;
        registerDisconnected();
        mLastNetworkId = WifiConfiguration.INVALID_NETWORK_ID;
    }
当一个AP连接断开时,主要会做如下几处理:

  1. stopDhcp():停止DHCP过程,即停止dhcpcd进程
  2. mNwService.clearInterfaceAddresses(mInterfaceName):通过NetworkManagementService通知Netd清除wlan0的地址信息
  3. mWifiInfo.reset():重置WifiInfo对象的状态
  4. setNetworkDetailedState(DetailedState.DISCONNECTED):将mNetworkInfo的连接状态设为DISCONNECTED
  5. mWifiConfigStore.updateStatus(mLastNetworkId, DetailedState.DISCONNECTED):将mLastNetworkId对应的 WifiConfiguration对象状态设为DISCONNECTED
  6. clearLinkProperties():清除mLinkProperties对象的配置信息
  7. sendNetworkStateChangeBroadcast():发广播通知上层网络状态变化
  8. registerDisconnected():做一些清理、记录工作

最后状态切换到DisconnectedState,等待下一次连接的发起,断开流程结束。

二、Wifi的关闭


从前面的博文可知,Wifi的开启、关闭都是调用WifiManager::setWifiEnabled(),嵌套调用WifiServiceImpl中的同名方法,向WifiController发送CMD_WIFI_TOGGLED消息:
    /**
     * see {@link android.net.wifi.WifiManager#setWifiEnabled(boolean)}
     * @param enable {@code true} to enable, {@code false} to disable.
     * @return {@code true} if the enable/disable operation was
     *         started or is already in the queue.
     */
    public synchronized boolean setWifiEnabled(boolean enable) {
        enforceChangePermission();
        Slog.d(TAG, "setWifiEnabled: " + enable + " pid=" + Binder.getCallingPid()
                    + ", uid=" + Binder.getCallingUid());
        if (DBG) {
            Slog.e(TAG, "Invoking mWifiStateMachine.setWifiEnabled\n");
        }

        /*
        * Caller might not have WRITE_SECURE_SETTINGS,
        * only CHANGE_WIFI_STATE is enforced
        */

        long ident = Binder.clearCallingIdentity();
        try {
            if (! mSettingsStore.handleWifiToggled(enable)) {
                // Nothing to do if wifi cannot be toggled
                return true;
            }
        } finally {
            Binder.restoreCallingIdentity(ident);
        }

        mWifiController.sendMessage(CMD_WIFI_TOGGLED);
        return true;
    }
前面的博文介绍过Wifi的启动流程,当WifiController向Wifi状态机发送启动wpa_s消息的时候,状态停留在DeviceActiveState。DeviceActiveState不处理CMD_WIFI_TOGGLED消息,交由其父状态StaEnabledState处理:
 case CMD_WIFI_TOGGLED:
                    if (! mSettingsStore.isWifiToggleEnabled()) {
                        if (mSettingsStore.isScanAlwaysAvailable()) {
                            transitionTo(mStaDisabledWithScanState);
                        } else {
                            transitionTo(mApStaDisabledState);
                        }
                    }
                    break;
结合前面的所讲的内容,可知状态切换到ApStaDisabledState,进行关闭流程,调用它的enter()方法:
        @Override
        public void enter() {
            mWifiStateMachine.setSupplicantRunning(false);
            // Supplicant can't restart right away, so not the time we switched off
            mDisabledTimestamp = SystemClock.elapsedRealtime();
            mDeferredEnableSerialNumber++;
            mHaveDeferredEnable = false;
            mWifiStateMachine.clearANQPCache();
        }
调用WifiStateMachine::setSupplicantRunning(false)向WifiStateMachine发送停止wpa_s的消息:CMD_STOP_SUPPLICANT。

SupplicantStartedState接收、处理该消息:
                case CMD_STOP_SUPPLICANT:   /* Supplicant stopped by user */
                    if (mP2pSupported) {
                        transitionTo(mWaitForP2pDisableState);
                    } else {
                        transitionTo(mSupplicantStoppingState);
                    }
                    break;
切换到SupplicantStoppingState,进入enter()方法:
public void enter() {
            /* Send any reset commands to supplicant before shutting it down */
            handleNetworkDisconnect();
            if (mDhcpStateMachine != null) {
                mDhcpStateMachine.doQuit();
            }

            String suppState = System.getProperty("init.svc.wpa_supplicant");
            if (suppState == null) suppState = "unknown";
            String p2pSuppState = System.getProperty("init.svc.p2p_supplicant");
            if (p2pSuppState == null) p2pSuppState = "unknown";

            logd("SupplicantStoppingState: stopSupplicant "
                    + " init.svc.wpa_supplicant=" + suppState
                    + " init.svc.p2p_supplicant=" + p2pSuppState);
            mWifiMonitor.stopSupplicant();

            /* Send ourselves a delayed message to indicate failure after a wait time */
            sendMessageDelayed(obtainMessage(CMD_STOP_SUPPLICANT_FAILED,
                    ++mSupplicantStopFailureToken, 0), SUPPLICANT_RESTART_INTERVAL_MSECS);
            setWifiState(WIFI_STATE_DISABLING);
            mSupplicantStateTracker.sendMessage(CMD_RESET_SUPPLICANT_STATE);
        }
  1. 调用handleNetworkDisconnect()处理AP连接的断开部分,第一部分已经讲过。
  2. 设置DhcpStateMachine的状态,停止DhcpStateMachine
  3. 调用WifiMonitor::stopSupplicant()停掉wpa_s
  4. 将wifi状态设置为disabling;setWifiState()函数会设置当前Wifi的状态,比如disabled、disabling、enabled等;我们通过监听函数发送的WifiManager.WIFI_STATE_CHANGED_ACTION广播,可以得知当前Wifi的具体状态。

WifiMonitor中下发终止指令后,会收到wpa_s断开的event:
else if (event == TERMINATING) {
            /**
             * Close the supplicant connection if we see
             * too many recv errors
             */
            if (eventData.startsWith(WPA_RECV_ERROR_STR)) {
                if (++sRecvErrors > MAX_RECV_ERRORS) {
                    if (DBG) {
                        Log.d(TAG, "too many recv errors, closing connection");
                    }
                } else {
                    eventLogCounter++;
                    return false;
                }
            }

            // Notify and exit
            mStateMachine.sendMessage(SUP_DISCONNECTION_EVENT, eventLogCounter);
            return true;
WifiMonitor会向wifi状态机发送SUP_DISCONNECTION_EVENT消息并最终退出,等待下一次重新与wpa_s建立通信。SupplicantStoppingState处理该消息:
               case WifiMonitor.SUP_DISCONNECTION_EVENT:
                    if (DBG) log("Supplicant connection lost");
                    handleSupplicantConnectionLoss(false);
                    transitionTo(mInitialState);
                    break;
    private void handleSupplicantConnectionLoss(boolean killSupplicant) {
        /* Socket connection can be lost when we do a graceful shutdown
        * or when the driver is hung. Ensure supplicant is stopped here.
        */
        if (killSupplicant) {
            mWifiMonitor.killSupplicant(mP2pSupported);
        }
        mWifiNative.closeSupplicantConnection();
        sendSupplicantConnectionChangedBroadcast(false);
        setWifiState(WIFI_STATE_DISABLED);
    }
handleSupplicantConnectionLoss()函数中,因为之前已经执行过stopSupplicant()的操作,killSupplicant传入false,所以不会重复执行关闭wpa_s的killSupplicant()函数;随后关闭wpa_s与wifi之间传递指令、事件的socket连接,最后设置当前Wifi状态为disabled,代表Wifi已经关闭完成。

handleSupplicantConnectionLoss()执行完毕后,wpa_s的状态已经被彻底清除掉,随之将Wifi状态机切换到InitialState:
        @Override
        public void enter() {
            WifiNative.stopHal();
            mWifiNative.unloadDriver();
            if (mWifiP2pChannel == null) {
                mWifiP2pChannel = new AsyncChannel();
                mWifiP2pChannel.connect(mContext, getHandler(),
                    mWifiP2pServiceImpl.getP2pStateMachineMessenger());
            }

            if (mWifiApConfigChannel == null) {
                mWifiApConfigChannel = new AsyncChannel();
                mWifiApConfigStore = WifiApConfigStore.makeWifiApConfigStore(
                        mContext, getHandler());
                mWifiApConfigStore.loadApConfiguration();
                mWifiApConfigChannel.connectSync(mContext, getHandler(),
                        mWifiApConfigStore.getMessenger());
            }

            if (mWifiConfigStore.enableHalBasedPno.get()) {
                // make sure developer Settings are in sync with the config option
                mHalBasedPnoEnableInDevSettings = true;
            }
        }
在enter()函数中,比较重要的操作就是mWifiNative.unloadDriver(),当Wifi完全关闭后,将驱动也卸载掉。当下一次Wifi启动流程启动时,再重新加载驱动、启动wpa_s。
到此,Wifi关闭的流程就结束了。


            
Android wifi源码分析(二) Wifi关闭流程 接着上一篇,这篇说一下Wifi的关闭流程。 由上一篇可以知道,framework层提供的wifi开关接口都是**setWifiEnabled**,只是参数不同而已。*true*表示开启wifi、*false*表示关闭wifi。 阅读详情

相关推荐

SDIO_WiFi驱动学习之安卓WLAN架构介绍及调用流程分析

一、引言 上一篇博客大概介绍了MMC子系统和SDIO相关知识及架构,这一篇博客则大致分析安卓的WLAN架构及上层如何调用WLAN驱动的流程。 虽然我工作的开发环境是安卓系统,但由于我不是专业的安卓应用/框架开发工程师,所以对安卓层的一些代码并不是特别熟悉,只能大致梳理流程,不专业的地方请谅解。 本文部分内容摘抄自网络,若有侵权,请联系删除。 二、安卓WLAN架构 1、应用框架(Application framework) 在应用程序框架级别是应用程序代码,它使用各种android.net..

陈子陌的博客 5088

android wifi断开原因分析

最近在解bug的过程中经常遇到密码正确但处于saved的状态,总结原因有已下几种: 1 在ASSOCIATING阶段由于丢包导致ASSOC REJECT 03-16 09:22:12.440 D/WifiMonitor( 924): Event [IFNAME=wlan0 CTRL-EVENT-DISCONNECTED bssid=08:cc:68:9e:ac:20 reason=3

dailinqing1984的博客 1万+

wifi自动连接,断开连接,打开和关闭,亲测有效

wifi自动连接,断开连接,打开和关闭,亲测有效 step1: 导入依赖 D:\workspace\WifiTwo\app\build.gradle implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'com.google.android.material:material:1.1.0' implementation 'androidx.constraintlayout:constraintlayout

cf8833的博客 3451

Android WiFi 经常掉线出现的几个原因分析!

原因1 .从Log分析来看,这个是由于Dhcp request fail 导致最终disconnect . Log 分析如下: 16:53:31.659 958 6525 D NetUtils: dhcp_do_request failed : wlan0 (renew) 08-26 16:53:31.659 958 6525 E DhcpStateMachine: DHCPV4 f

一杯咖啡的专栏 2万+

openwrt wifi 出现missing ACKs和deauthenticated due to inactivity 频繁掉线问题解决方案

路由器出现频繁掉线问题 关键log1: Mon Dec 25 17:28:25 2017 daemon.info hostapd: wlan0: STA 00:00:00:00:00:00 IEEE 802.11: disconnected due to excessive missing ACKs Mon Dec 25 17:28:28 2017 daemon.info hostapd: wl...

wgl307293845的博客 4730

高通平台WIFI学习--修复 wpa_supplicant 异常连接事件:断开状态下过滤意外关联请求

摘要:本文针对wpa_supplicant在Wi-Fi连接中出现的异常问题提出修复方案。当设备处于断开状态时仍可能收到关联事件(EVENT_ASSOC),导致状态混乱、资源泄露等风险。解决方案是在事件处理流程中增加状态校验,当检测到设备处于断开状态时直接忽略该事件。修复后的代码通过日志记录异常情况,同时保持与其他功能的兼容性。该方案通过防御性编程提高了系统稳定性和安全性,类似思路可扩展应用于其他网络事件处理场景。(148字)

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 679

【安卓Framework学习】Wifi框架学习之开启与关闭流程

前言 上一篇记录了安卓wifi框架中的主要的核心类,后续学习内容主要从实际的操作动作或者业务流程出发,分析其在wifi框架中的主要流程。本次学习内容针对常见的开启和关闭wifi来梳理其中的流程。文中出现的代码大部分基于android11源码。...............

qq_39036223的博客 6274

解决Wi-Fi断连问题的编程方法

通过监测Wi-Fi连接状态并自动执行重新连接操作,我们可以提高网络连接的稳定性,减少断连问题带来的影响。本文将介绍一个通过编程优化网络连接稳定性的方法,帮助解决Wi-Fi断连问题。下面是一个使用Python编程语言的示例代码,演示了如何检测Wi-Fi连接是否断开,并在断连发生时进行自动重连。通过这种编程方法,我们可以实现自动监测和重连Wi-Fi连接,提高网络连接的稳定性。当Wi-Fi断连问题发生时,程序将自动执行重新连接操作,减少了用户手动干预的需要。在网络连接中,Wi-Fi断连是一个常见的问题。

Book_Sea的博客 214

Android WiFi 打开关闭流程

本文简单介绍下WiFi打开与关闭流程,参考源码Android P。 一、WiFi 开机自动打开流程 系统服务启动的时候会启动WifiService,在SystemService.PHASE_SYSTEM_SERVICES_READY的时候,会调用 WifiServiceImpl#checkAndStartWifi(),获取Wi-Fi开关,持久化存储的值。 然后判断是否需要打开WiFi。 /** * Check if we are ready to start wifi.

WXQ521520的博客 4906

android wifi连接与断开

android 实现wifi连接与断开 可以完全代替系统设置的wifi管理功能,搜索wifi按照信号强度排序,button刷新,记住密码等功能

量子城域网系列(六):从星型到环形,解析QKD网络拓扑的演进与选型

本文深入解析了量子密钥分发网络从星型到环形等主流拓扑结构的演进历程与核心原理。针对量子城域网的实际部署,文章详细对比了星型、总线型和环形拓扑的优缺点,并结合政务云、金融网点等典型应用场景,提供了实战选型指南,帮助读者在物理限制、安全需求与成本效率间找到最佳平衡。

weixin_29197835的博客 111

【安卓Framework学习】Wifi框架学习之连接与断开流程

前几篇介绍了wifi框架中的状态机和wifi的开关流程,本篇将基于wifi的连接和断开功能分析其代码流程。由于连接和断开是wifi功能中用得最多也是最重要的功能之一,可以说前几篇都也为这一篇做了铺垫。............

qq_39036223的博客 4400

FineReport V11.0安装避坑指南:从下载到激活的完整流程(附百度网盘链接)

本文提供FineReport V11.0从下载、安装到激活的完整避坑指南。详细解析了部署前的环境准备、安装过程中的JVM内存等核心配置、激活流程以及安装后的优化与常见问题排查,旨在帮助用户一次部署成功,确保企业级报表平台的稳定运行。

echo99的专栏 1193

Android 10自动连接WiFi问题 Android 10 断开WiFi问题

说明:本文主要说明扫码之后自动连接WiFi的一些处理,扫码的流程相对简单,网上教程也比较多,对于目前Android各个版本也没有太多变化。 问题描述:最近在做项目的时候,发现以前的项目有扫描二维码自动连接WiFi的功能,设备改了生成二维码的方式,然后发现手机无法自动连接WiFi了。 问题原因:经过代码调试发现:(我都是真机调试) wifiManager.addNetwork(WifiCo...

曹小旭 1万+

应急响应-勒索病毒典型处置案例

服务器感染Globelmposter勒索病毒 事件背景 2020年5月,某公司内外服务器遭遇勒索病毒攻击,应急响应工程师在抵达现场后,对包含服务器在内的13太机器进行系统排查和日志分析。 事件处置 勒索病毒初步判定 首先,对其中一台感染勒索病毒的主机A(源地址为192.168.111.129)进行排查,通过勒索信确认为GlobeImposter勒索病毒,如图所示。 在本地桌面及磁盘发现加密文件后缀为.RESERVE,如图所示。 系统排查 主机账号 通过

qq_50765147的博客 2458

基于PLC的矿用排水控制系统设计【附代码】

(3)矿用排水控制系统的软件设计 研究设计了矿用排水控制系统的软件,包括PLC程序的编写和上位机监控画面的设计。(2)矿用排水控制系统的硬件设计 研究对矿用排水控制系统的硬件进行了选型和设计,包括矿用多级耐磨离心泵、三相异步防爆电机等执行设备的选型,以及控制系统所需用到的各类型传感器、PLC的I/O点分配及选型。(1)矿用排水控制系统的现状分析 研究首先对矿井排水系统的现状进行了分析,指出了现有系统存在的问题,如自动化程度低、劳动强度大、设备维护困难等。✅ 具体问题可以私信或查看文章底部二维码。

lagougongzuoshi的博客 1173

Android13 Wifi启动流程分析

本文对Android13 wifi 开启流程进行梳理,有需要的可以看看。如果遇到wifi 打不开问题,可以依照这个流程进行分析,看看具体是哪个流程出现问题。如果后续需要分析比Android13 更新的代码可以对比参考,毕竟Android11的代码变动比较大。本文最后有流程总结,代码分析过程还有最大一个亮点,每个类的流程分析都标志了数字,避免读着读着就迷路了。最后还有wifi开关相关日志过程分析。

wenzhi的博客 5929

3D视觉-激光三角测量法的概述和原理

激光三角法位移测量的原理是,用一束激光以某一角度聚焦在被测物体表面,然后从另一角度对物体表面上的激光光斑进行成像,物体表面激光照射点的位置高度不同,所接受散射或反射光线的角度也不同,用。激光三角测量法是一种通过图像采集系统采集被测物表面漫反射的激光轮廓,进而基于设备已知的相对位置通过算法处理,获得被测物表面的三维轮廓数据,进而还原目标物体三维空间信息的方法。采用激光三角原理和回波分析原理进行非接触位置、位移测量的精密传感器, 广泛应用于位置、位移 、厚度、半径、形状、振动、距离等几何量的工业测量。

qq_20660115的博客 3919

【Android 12.0】Android S WiFi关闭业务流程分析(UML图)

以下为Android S的WiFi关闭(stop)业务流程UML图,业务流程的过程详情因公司规定不可复制源码出来,所以想看业务流程详情的同学可以参考其他博主所发的博客。业务流程参考内容链接我会放在本文章后面。 图一为手机在WiFi设置界面点下WiFi按钮关闭后WiFi关闭(stop)的业务流程。 1、WifiStop业务流程 WiFi Stop业务流程源码详情参考:Android wifi源码分析(二) Wifi关闭流程 - 简书接着上一篇,这篇说一下Wifi的关闭流程。 由上一篇可以知道,fra

极音战歌 1055

Code Ocean 上传代码 手把手教程

对于一些学术期刊,录用前会让把代码上传到Code Ocean上,但上传过程可能会遇到一些问题,小编分享一下自己的上传经验。他们会进行验证,验证通过,将自动发布。点此运行即可,但是运行比较慢。

u014071947的博客 1万+

Vue项目实战:用DataV的dv-scroll-board打造高颜值滚动表格(附完整代码)

本文详细介绍了如何在Vue项目中使用DataV的dv-scroll-board组件打造高颜值滚动表格。从基础集成到高级配置,包括动态数据处理、深度样式定制、性能优化策略以及交互增强方案,帮助开发者快速实现企业级数据展示需求。特别针对样式优化和滚动表格的常见问题提供了实用解决方案。

weixin_30892037的博客 497

WiFi关闭流程

/android/packages/apps/Settings/src/com/android/settings/wifi/WifiEnabler.java: public boolean onSwitchToggled(boolean isChecked) { mWifiManager.setWifiEnabled(isChecked) } /android/frameworks/base/wifi/java/android/net/wifi/WifiManager.java: public bool

weixin_43159275的博客 684

ICME 2026 即插即用 | 特征增强篇 | FSD:多尺度小波分解+频域特征融合,结构细节纹理均增强,性能猛涨!

本文提出了一种基于频域结构解耦和区域感知融合的双路径学习框架(FSD),用于低光图像超分辨率任务。该框架通过多尺度小波变换将输入图像分解为低频亮度结构和高频纹理细节两个正交分量,并采用双路径网络分别处理这两个分量,最后通过跨频段语义重组模块实现特征融合。实验表明,FSD模块在多项指标上显著优于现有方法,能有效提升图像的结构自然度和细节清晰度。该模块适用于对频域/结构/纹理敏感的视觉任务,可直接嵌入网络实现端到端训练。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 140

android开发中Wifi功能总结

写在前面 距离上次写博客还是在几个月以前了,最近几个月实在是太忙了,跑去做课设和ios开发,短暂地告别了Android,直到最近在某院实习做毕业设计时需要用到Android系统进行室内定位开发,本文主要是将在项目开发的过程中遇到的关于wifi开发的问题记录下来,方便大家整理。 情景提要 Android开发过程中,应该说Wifi是很重要的一个功能,在产品中,可能需要随时监听网络状况的变化等

yourzeromax的博客 3万+

ilitek奕力USBUpgradeTool电容触摸屏烧录程序最新版V2.3

ilitek奕力USBUpgradeTool电容触摸屏烧录程序最新版V2.3修一台大屏一体机电容触摸屏的,完全不能用,买不到一样的板,不断查找资料,花了几天时间才找到这个软件,亲测读取和烧录能用。

532破解全加密.zip

pn532数据解密,数据分析,破解辅助计算工具,等几十余款软件,

java实现断开wifi_WiFi关闭流程

/android/packages/apps/Settings/src/com/android/settings/wifi/WifiEnabler.java:public boolean onSwitchToggled(boolean isChecked) {mWifiManager.setWifiEnabled(isChecked)}/android/frameworks/base/wifi/j...

weixin_35415045的博客 565

Discontinuous Galerkin Method.zip_galerkin_galerkin method_间断 有限

间断有限元的matlab程序,好用的程序

上一篇: Android -- ConnectifyService网络更新流程简介
下一篇: Java -- JNI中的数据类型
第一序列丶
博客等级 码龄11年 249粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值