栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Android 9 WIFI 打开流程

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android 9 WIFI 打开流程

Wifi 打开 流程

App端 打开wifi操作

private WifiManager mWifiManager; 
mWifiManager = (WifiManager) mContext.getSystemService(WifiManager.class);\获取WIFI的服务
mWifiManager.setWifiEnabled(true) 

让我们看一下WifiManager设置的时候是如何操作

	
public WifiManager(Context context, IWifiManager service, Looper looper) {
        mContext = context;
        mService = service; //拿到IWifiManager的接口
        mLooper = looper;
        mTargetSdkVersion = context.getApplicationInfo().targetSdkVersion;
}

 
public boolean setWifiEnabled(boolean enabled) {
  try {
       return mService.setWifiEnabled(mContext.getOpPackageName(), enabled);//通过IWifiManager与服务进行通讯
      } catch (RemoteException e) {
          throw e.rethrowFromSystemServer();
      }
  }

WifiManager通过Binder机制与WifiServiceImpl进行通讯

WifiServerImpl
(路径:frameworksoptnetwifiservicejavacomandroidserverwifiWifiServiceImpl.java)

public class WifiServiceImpl extends IWifiManager.Stub {
 	 
    @Override
    public synchronized boolean setWifiEnabled(String packageName, boolean enable)
            throws RemoteException {
            //判断调用的app是否具有权限
        if (enforceChangePermission(packageName) != MODE_ALLOWED) {
            return false;
        }

        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 (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 = mWifiApState == WifiManager.WIFI_AP_STATE_ENABLED;

        if (apEnabled && !isFromSettings) {
            mLog.info("setWifiEnabled SoftAp not disabled: only Settings can enable wifi").flush();
            return false;
        }

       
        long ident = Binder.clearCallingIdentity();
        try {
        	//保存wifi状态
            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;
    }
}
WIFIController.java

WififController 管理wifi开关,热点开关等状态

public class WifiController extends StateMachine {
...
	class StaDisabledState extends State {
		...
		@Override
        public boolean processMessage(Message msg) {
        	  switch (msg.what) {
                case CMD_WIFI_TOGGLED:
                	if (mSettingsStore.isWifiToggleEnabled()) {
                        ...
                        transitionTo(mDeviceActiveState);//转换到了DeviceActiveState状态;
                    } else if (checkScanOnlyModeAvailable()) {  //检测是否有被禁用位置服务
                       // 只有在我们不处于飞行模式时才进入扫描模式
                        if (mSettingsStore.isAirplaneModeOn()) {
                            transitionTo(mStaDisabledWithScanState);//转换到了DeviceActiveState状态
                        }
                    }
                    break;
                }
        }
        ...
	}
...
}
class DeviceActiveState extends State {
		@Override
        public void enter() {
            ...
            mWifiStateMachinePrime.enterClientMode();//调用WifiStateMachinePrime.java方法
            ...
        }
}
WifiStateMachinePrime.java

(路径:frameworksoptnetwifiservicejavacomandroidserverwifiWifiStateMachinePrime.java)

public class WifiStateMachinePrime {
		....
		
	    public void enterClientMode() {
	        changeMode(ModeStateMachine.CMD_START_CLIENT_MODE);
	    }

		//
		private void changeMode(int newMode) {
        	mModeStateMachine.sendMessage(newMode);
    	}

		private class ModeStateMachine extends StateMachine {
		...
		//最后会走到checkForAndHandleModeChange
			private boolean checkForAndHandleModeChange(Message message) {
            switch(message.what) {
                case ModeStateMachine.CMD_START_CLIENT_MODE:
                    Log.d(TAG, "Switching from " + getCurrentMode() + " to ClientMode");
                    //切换到ClientModeActiveState状态。
                    mModeStateMachine.transitionTo(mClientModeActiveState);
                    break;
                    ...
            }
            return HANDLED;
        	}
		}
}

转到ClientModeActiviteState状态
WifiStateMachinePrime.java

class ClientModeActiveState extends ModeActiveState {
		...
			@Override
            public void enter() {
				mManager = mWifiInjector.makeClientModeManager(mListener);
                mManager.start();//跳转到ClientModeManager的start方法
			}
	   ...
}
ClientModeManager.java

(路径:frameworksoptnetwifiservicejavacomandroidserverwifiClientModeManager.java)

public class ClientModeManager implements ActiveModeManager {
	....
	
    public void start() {
        mStateMachine.sendMessage(ClientModeStateMachine.CMD_START);//会跳转到IdleState(初始化时候默认是IdleState)
    }
	...
	private class IdleState extends State {
		@Override
        public boolean processMessage(Message message) {
			switch (message.what) {
                    case CMD_START:
                    	
                    	updateWifiState(WifiManager.WIFI_STATE_ENABLING,
                                        WifiManager.WIFI_STATE_DISABLED);

                        if (WifiInjector.getInstance().getAtcAospEnhancement()) {
                            mEnableTime = Calendar.getInstance().getTimeInMillis();
                            Log.d(TAG, "We will check Wi-Fi Enable time");
                        }
						//setupInterfaceForClientMode方法startHal
                        mClientInterfaceName = mWifiNative.setupInterfaceForClientMode(
                                false , mWifiNativeInterfaceCallback);
                        if (TextUtils.isEmpty(mClientInterfaceName)) {
                            Log.e(TAG, "Failed to create ClientInterface. Sit in Idle");
                            updateWifiState(WifiManager.WIFI_STATE_UNKNOWN,
                                            WifiManager.WIFI_STATE_ENABLING);
                            updateWifiState(WifiManager.WIFI_STATE_DISABLED,
                                            WifiManager.WIFI_STATE_UNKNOWN);
                            break;
                        }
                        sendScanAvailableBroadcast(false);
                        mScanRequestProxy.enableScanningForHiddenNetworks(false);
                        mScanRequestProxy.clearScanResults();
                        transitionTo(mStartedState);
                        break;
                   ...     
            }
		}
	}
}

总结:App端都是通过wifimanager暴露的接口通过binder机制与WifiServer进行通信。
//setupInterfaceForClientMode方法startHal,下面就是开始到hal层(后面会继续更新),可能会根据硬件芯片厂商做一些定制化的操作

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/777145.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号