Android 4.0 WIFI初始化与启动流程

本文详细介绍了Android 4.0 (ICS) 中的WiFi初始化和启动过程,涉及SystemServer.java、WifiSettings.java等多个关键文件及类。在系统启动时,通过ConnectivityService管理无线通信,然后检查并根据需求启动WiFi。用户在设置界面开启WiFi时,会通过一系列步骤,包括调用WifiManager的setWifiEnabled方法,最终通过WifiStateMachine实现WiFi状态的切换,加载驱动并启动supplicant。整个流程涉及到Android内部的AIDL通信和状态机机制。
摘要由CSDN通过智能技术生成

这几天闲着没事,我就随便拿起Android源码看看。以下要讲的是在ICS中wifi初始化的一些流程。

涉及的文件有:

SystemServer.java

WifiSettings.java

WifiEnabler.java

WifiManager.java

WifiService.java

WifiStateMachine.java

android_net_wifi_wifi.cpp

wifi.c


首先从SystemServer.java开始,它做了3个动作:

1.添加注册ConnectivityService连接服务,它跟所有手机的无线通信都有联系,包括wifi,蓝牙,2g网络,3g网络等

connectivity = new ConnectivityService(
                        context, networkManagement, networkStats, networkPolicy);
ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity);

2.管理开机wifi开启与否的问题

wifi.checkAndStartWifi();

    public void checkAndStartWifi() {
        mAirplaneModeOn.set(isAirplaneModeOn());
        mPersistWifiState.set(getPersistedWifiState());
        boolean wifiEnabled = shouldWifiBeEnabled() || testAndClearWifiSavedState();
        setWifiEnabled(wifiEnabled);
        mWifiWatchdogStateMachine = WifiWatchdogStateMachine.
               makeWifiWatchdogStateMachine(mContext);

    }


3.添加注册wifi的核心服务wifiservice

 wifi = new WifiService(context);
 ServiceManager.addService(Context.WIFI_SERVICE, wifi);

好了,机器启动的时候动作就这些。要开启wifi,还需要人在设置界面进行开启。·

下面将一步步介绍wifi是怎样开启起来的

进入wifi设置界面,相关文件WifiSettings.java

开启Wifi的组件是一个CompoundButton,跟它关联起来的是一个WifiEnabler.java类,它是在WifiSettings里面初始化的

    public void onActivityCreated(Bundle savedInstanceState) {
                mWifiEnabler = new WifiEnabler(activity, actionBarSwitch);

    }

当用户点击wifi的开启按钮时候,会触发WifiEnabler里面的onCheckedChanged函数

    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

        if (mWifiManager.setWifiEnabled(isChecked)) {
            mSwitch.setEnabled(false);
         } else {
                Toast.makeText(mContext, R.string.wifi_error, Toast.LENGTH_SHORT).show();
    }

在onCheckedChanged函数里面,调用了WifiManager的setWifiEnabled方法

    public boolean setWifiEnabled(boolean enabled) {
        try {
            return mService.setWifiEnabled(enabled);
        } catch (RemoteException e) {
            return false;
        }
    }

它返回的是mService.setWifiEnabled(enabled),这里的mService是WifiService的代理,所以它实际调用的是wifiService里面的setWifiEnabled函数

public class WifiService extends IWifiManager.Stub ,我们可以看到WifiService继承一个接口IWifiManager.Stub,凡是继承了像这种形式写法的接口服务,都可以进行远程调用,这就是Android内部的aidl通信。接下来进入wifiservice

    public synchronized boolean setWifiEnabled(boolean enable) {

        mWifiStateMachine.setWifiEnabled(enable);

    }

可以看到,又进入WifiStateMachine的setWifiEnabled方法,mWifiStateMachine是在Wifiservice的构造函数完成初始化 的

    WifiService(Context context) {

        mWifiStateMachine = new WifiStateMachine(mContext, mInterfaceName);

    }

先介绍一下WifiStateMachine这个类,光看名字就知道wifi状态机,它里面记录了wifi的各种状态,driverUnloadedstate、mDriverUnloadingState、mDriverLoadingState、mDriverLoadedState、mSupplicantStartingState,每种状态都有enter()、exit()、processMessage()3个函数,分别处理进入该状态,退出该状态的动作,以及消息处理。在WifiStateMachine构造函数里面,它把所有状态都添加进状态机去,形成一个状态树,并在结尾出启动这个状态机工作。

    public WifiStateMachine(Context context, String wlanInterface) {

        addState(mDefaultState);
            addState(mInitialState, mDefaultState);
            addState(mDriverUnloadingState, mDefaultState);
            addState(mDriverUnloadedState, mDefaultState);
                addState(mDriverFailedState, mDriverUnloadedState);
            addState(mDriverLoadingState, mDefaultState);
   

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值