日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android Wifi 启动过程,AndroidP wifi启动流程

發(fā)布時間:2025/3/21 Android 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android Wifi 启动过程,AndroidP wifi启动流程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

從AndroidO到AndroidP,Wifi架構(gòu)上還是發(fā)生了挺多變化的。接口上也在發(fā)生變化,所以網(wǎng)上的很多的流程梳理已經(jīng)跟當(dāng)前的代碼邏輯有一些差異了。不過還好,總體上,只要懂了一個版本的代碼,看其他版本問題已經(jīng)不是很大。

梳理還是簡單易懂為要務(wù)。

調(diào)用WifiManager中的setWifiEabled()開啟wifi:

public boolean setWifiEnabled(boolean enabled) {

try {

return mService.setWifiEnabled(getContext().getOpPackageName(), enabled);

} catch (RemoteException e) {

throw e.rethrowFromSystemServer();

}

}

通過aidl調(diào)用到系統(tǒng)進(jìn)程中的服務(wù)類WifiServiceImpl.java中:

public synchronized boolean setWifiEnabled(String packageName, boolean enable)

throws RemoteException {

enforceChangePermission();

Slog.d(TAG, "setWifiEnabled: " + enable + " pid=" + Binder.getCallingPid()

+ ", uid=" + Binder.getCallingUid() + ", package=" + packageName);

mLog.info("setWifiEnabled package=% uid=% enable=%").c(packageName)

.c(Binder.getCallingUid()).c(enable).flush();

boolean isFromSettings = checkNetworkSettingsPermission(

Binder.getCallingPid(), Binder.getCallingUid());

// If Airplane mode is enabled, only Settings is allowed to toggle Wifi

if (mSettingsStore.isAirplaneModeOn() && !isFromSettings) {

mLog.info("setWifiEnabled in Airplane mode: only Settings can enable wifi").flush();

return false;

}

// If SoftAp is enabled, only Settings is allowed to toggle wifi

boolean apEnabled =

mWifiStateMachine.syncGetWifiApState() != WifiManager.WIFI_AP_STATE_DISABLED;

if (apEnabled && !isFromSettings) {

mLog.info("setWifiEnabled SoftAp not disabled: only Settings can enable wifi").flush();

return false;

}

/*

* 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);

}

if (mPermissionReviewRequired) {

final int wiFiEnabledState = getWifiEnabledState();

if (enable) {

if (wiFiEnabledState == WifiManager.WIFI_STATE_DISABLING

|| wiFiEnabledState == WifiManager.WIFI_STATE_DISABLED) {

if (startConsentUi(packageName, Binder.getCallingUid(),

WifiManager.ACTION_REQUEST_ENABLE)) {

return true;

}

}

} else if (wiFiEnabledState == WifiManager.WIFI_STATE_ENABLING

|| wiFiEnabledState == WifiManager.WIFI_STATE_ENABLED) {

if (startConsentUi(packageName, Binder.getCallingUid(),

WifiManager.ACTION_REQUEST_DISABLE)) {

return true;

}

}

}

mWifiController.sendMessage(CMD_WIFI_TOGGLED);

return true;

}

此段代碼邏輯中有涉及到權(quán)限檢測,以及wifi開關(guān)狀態(tài)保存等操作,最終調(diào)用到了如下方法:

mWifiController.sendMessage(CMD_WIFI_TOGGLED);

WifiController是一個狀態(tài)機(jī),接收到消息會根據(jù)處理邏輯進(jìn)行不同狀態(tài)的跳轉(zhuǎn),如下代碼

if (checkScanOnlyModeAvailable()) {

setInitialState(mStaDisabledWithScanState);

} else {

setInitialState(mStaDisabledState);

}

WifiController的初始狀態(tài)為mStaDisabledState,所以CMD_WIFI_TOGGLED消息應(yīng)該在此狀態(tài)下處理,查看其處理邏輯:

case CMD_WIFI_TOGGLED:

if (mSettingsStore.isWifiToggleEnabled()) {

if (doDeferEnable(msg)) {

if (mHaveDeferredEnable) {

// have 2 toggles now, inc serial number and ignore both

mDeferredEnableSerialNumber++;

}

mHaveDeferredEnable = !mHaveDeferredEnable;

break;

}

transitionTo(mDeviceActiveState);

} else if (checkScanOnlyModeAvailable()) {

// only go to scan mode if we aren't in airplane mode

if (mSettingsStore.isAirplaneModeOn()) {

transitionTo(mStaDisabledWithScanState);

}

}

break;

代碼邏輯大致為:

先判斷當(dāng)前設(shè)備狀態(tài)是否支持打開wifi,如下方法:

public synchronized boolean isWifiToggleEnabled() {

if (!mCheckSavedStateAtBoot) {

mCheckSavedStateAtBoot = true;

if (testAndClearWifiSavedState()) return true;

}

if (mAirplaneModeOn) {

return mPersistWifiState == WIFI_ENABLED_AIRPLANE_OVERRIDE;

} else {

return mPersistWifiState != WIFI_DISABLED;

}

}

有涉及到飛行模式的相關(guān)考慮。

檢測是否兩次點擊調(diào)用開啟wifi是否時間差太短,如果太短,消息延時處理,否則的話直接跳轉(zhuǎn)到mDeviceActiveState

如果wifi當(dāng)前不支持打開,而此時“wifi scan always開關(guān)”打開,我們?nèi)匀灰蜷_wifi,進(jìn)入到mStaDisabledWithScanState狀態(tài)。

接著上面的第二個步驟,當(dāng)我們跳轉(zhuǎn)到mDeviceActiveState之后,會繼續(xù)相關(guān)邏輯處理。

WifiController狀態(tài)機(jī)此時會用到,如下:

addState(mDefaultState);

addState(mStaDisabledState, mDefaultState);

addState(mStaEnabledState, mDefaultState);

addState(mDeviceActiveState, mStaEnabledState);

addState(mStaDisabledWithScanState, mDefaultState);

addState(mEcmState, mDefaultState);

進(jìn)入到mDeviceActiveState之后會調(diào)用其enter方法,調(diào)用如下兩個方法:

mWifiStateMachinePrime.enterClientMode();

mWifiStateMachine.setHighPerfModeEnabled(false);

通過查閱代碼邏輯,可以看出:

/**

* Method to switch wifi into client mode where connections to configured networks will be

* attempted.

*/

public void enterClientMode() {

int mode = ModeStateMachine.CMD_START_CLIENT_MODE;

if (mIsSupportCucc) {

final FrameworkFacade facade = mWifiInjector.getFrameworkFacade();

int networktype = facade.getIntegerSetting(mContext,

Global.NETWORK_PREFERENCE, WIFI_DATA_TYPE);

int mobileDataStatus = facade.getIntegerSetting(mContext,

Global.MOBILE_DATA, MOBILE_DATA_ENABLE);

if (mobileDataStatus == MOBILE_DATA_ENABLE && networktype == MOBILE_DATA_TYPE) {

Log.d(TAG, "CUCC, client mode isn't allowed now, enter scan only mode");

mode = ModeStateMachine.CMD_START_SCAN_ONLY_MODE;

}

}

changeMode(mode);

}

看注釋大意為:

使wifi跳轉(zhuǎn)到client模式的一種方法,客戶端模式中,

總結(jié)

以上是生活随笔為你收集整理的Android Wifi 启动过程,AndroidP wifi启动流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产乱子伦一区二区 | 黄色片免费观看 | 天天射天天拍 | 伊人网伊人网 | 在线观看911视频 | 舐め犯し波多野结衣在线观看 | 欧美国产日韩在线视频 | 欧美日韩在线免费看 | 成人精品视频在线播放 | 黄色一级在线观看 | 玩日本老头很兴奋xxxx | 蜜臀一区二区三区精品免费视频 | 污视频在线 | 国产精品毛片一区二区在线看 | 美女写真福利视频 | 在线观看少妇 | 一级做a爱 | 午夜在线观看av | 奇米影视亚洲春色 | 污污免费观看 | 在线你懂得 | 亚洲图片一区二区三区 | 97在线观看免费高清 | 免费黄片毛片 | 色哟哟在线 | 日b视频免费 | 欧美成人专区 | 国产精品久久久午夜夜伦鲁鲁 | 国产精品午夜福利视频234区 | 人人澡超碰碰97碰碰碰 | 精品国产一区二区三区在线 | 最新精品国产 | 久草成人在线视频 | av高清在线 | ww欧美| 国产精品老熟女视频一区二区 | 色哟哟在线观看 | 美脚の诱脚舐め脚视频播放 | 男同精品 | 国产午夜免费视频 | 国产又黄又大又粗的视频 | 国产在视频线精品视频 | 无码少妇一区二区 | 岛国精品在线观看 | 亚洲色鬼| 美日韩成人 | 黄色一级片国产 | 97精品人妻麻豆一区二区 | 三级成人网 | 青娱乐91视频| 亚洲伦理视频 | 国产靠逼网站 | 奇米色777| 999在线视频 | 欧美大片免费在线观看 | 图片区视频区小说区 | 亚洲欧美一区二区三区情侣bbw | 中国老头性行为xxxx | 97视频在线观看免费高清完整版在线观看 | 国产www网站| 在线观看岛国av | 久久99网 | 精品一区二区三区四区视频 | 在线免费看av的网站 | 三级a级片| 日韩国产成人在线 | 国产高清中文字幕 | 亚洲精选久久 | 中文在线观看免费 | 在线免费观看国产 | 黄色在线视频观看 | 中文字幕最新在线 | 亚洲三级色 | 欧美日韩制服 | 武林美妇肉伦娇喘呻吟 | 亚洲不卡一区二区三区 | 日本一区二区在线视频 | 秋霞在线一区 | 丁香婷婷激情五月 | 牛牛在线 | 天天久| 中文字幕乱码人妻无码久久95 | 97人妻一区二区精品视频 | 伊人9| 老局长的粗大高h | 少妇太爽了太深了太硬了 | 97超碰人人看 | 日韩精品一区二区三区电影 | 日韩av在线网 | 亚洲一区免费在线观看 | 国产一级黄色片子 | 小色哥网站 | 日本大尺度激情做爰hd | 亚洲成人福利在线 | 一区二区在线视频免费观看 | 亚洲成人自拍网 | 潘金莲一级淫片aaaaaa播放 | 成年人爱爱视频 | 爱爱视频免费看 |