SystemServer是在虚拟机启动后,开始初始化和运行。其它的系统服务在System Server进程的环境中运行。/base/services/java/com/android/server/SystemServer.java 

我们在initAndLoop()方法中很快就定位到控制wifi开启或关闭的方法WifiService wifi = null; wifi.checkAndStartWifi();

跟踪到WifiService中的checkAndStartWifi();

 public void checkAndStartWifi() {        /* Check if wi-fi needs to be enabled */        boolean wifiEnabled = mSettingsStore.isWifiToggleEnabled();        Slog.i(TAG, "WifiService starting up with Wi-Fi " +                (wifiEnabled ? "enabled" : "disabled"));        //FixL1860_Bug00000177,For setWifiEnabled may sometimes have exception.        //So Make sure WifiWatchdogStateMachine is created first.        mWifiWatchdogStateMachine = WifiWatchdogStateMachine.               makeWifiWatchdogStateMachine(mContext);        // If we are already disabled (could be due to airplane mode), avoid changing persist        // state here        //if (wifiEnabled) setWifiEnabled(wifiEnabled);        if (wifiEnabled) setWifiEnabledOnBoot(wifiEnabled);    }
到此我们已经查到了wifi开启或者关闭是由 boolean wifiEnabled = mSettingsStore.isWifiToggleEnabled();控制的。

 synchronized boolean isWifiToggleEnabled() {        if (!mCheckSavedStateAtBoot) {            mCheckSavedStateAtBoot = true;            if (testAndClearWifiSavedState()) return true;                    }        if (mAirplaneModeOn) {            return mPersistWifiState == WIFI_ENABLED_AIRPLANE_OVERRIDE;        } else {            return mPersistWifiState != WIFI_DISABLED;        }    }

我们继续分析代码。发现mCheckSavedStateAtBoot是只我们修改过默认初始值后,手机再次重启将查询我们修改的值。

    private boolean testAndClearWifiSavedState() {        final ContentResolver cr = mContext.getContentResolver();        int wifiSavedState = 0;        try {            wifiSavedState = Settings.Global.getInt(cr, Settings.Global.WIFI_SAVED_STATE);            if(wifiSavedState == 1)                Settings.Global.putInt(cr, Settings.Global.WIFI_SAVED_STATE, 0);        } catch (Settings.SettingNotFoundException e) {            ;        }        System.out.println("wifiSavedState="+wifiSavedState);        return (wifiSavedState == 1);    }

这段代码会Settings.Global.getInt 数据库里的wifi状态值,当然我们现在是想定位到系统默认值,那么就不做深入分析了,有兴趣的朋友可以自己看看。回到上isWifiToggleEnabled代码中去,继续分析,这么有一个判断如果是飞行模式则return mPersistWifiState == WIFI_ENABLED_AIRPLANE_OVERRIDE;不是则return mPersistWifiState != WIFI_DISABLED;。那么这个mPersistWifiState是什么呢?

private int mPersistWifiState = WIFI_DISABLED;它定义的初始值是WIFI_DISABLED,如果异常我们先关闭掉wifi,如果没有异常(这是防止空指针报错赋值),当然我们初始化

WifiSettingsStore对象时,将重新赋值。

  WifiSettingsStore(Context context) {        mContext = context;        mAirplaneModeOn = getPersistedAirplaneModeOn();        mPersistWifiState = getPersistedWifiState();        mScanAlwaysAvailable = getPersistedScanAlwaysAvailable();    }
private int getPersistedWifiState() {        final ContentResolver cr = mContext.getContentResolver();        try {            return Settings.Global.getInt(cr, Settings.Global.WIFI_ON);        } catch (Settings.SettingNotFoundException e) {            Settings.Global.putInt(cr, Settings.Global.WIFI_ON, WIFI_DISABLED);            return WIFI_DISABLED;        }    }
这边就是我们获取数据库默认值的方法了。 Settings.Global.getInt(cr, Settings.Global.WIFI_ON); WIFI_ON又是什么呢?分析代码后发现其实是数据库的一个字符串。

       /**        * Whether the Wi-Fi should be on.  Only the Wi-Fi service should touch this.        */       public static final String WIFI_ON = "wifi_on"
如何快速定位到这个数据库就要看个人经验了,其实我这边是用了个比较懒的方法,我直接在服务器中搜索的这个字段。如果很快就看到了databaseHelper类了。呵呵,是不是很偷懒。哈哈。

 loadBooleanSetting(stmt, Settings.Global.WIFI_ON,                    R.bool.def_wifi_on);
这里就可以很清晰的看到wifi_on字段是有 R.bool.def_wifi_on控制的。

 private void loadBooleanSetting(SQLiteStatement stmt, String key, int resid) {        loadSetting(stmt, key,                mContext.getResources().getBoolean(resid) ? "1" : "0");    }
大致思路就分析到这里了,很多具体的步骤因为太烦躁也没什么难点就不看了,有兴趣的小伙伴可以自己去看看。

同样移动数据,GPS关闭都是由此数据库控制的。

移动数据:

由设置中的DataUsageSummary类setMobileDataEnabled(boolean enabled) 方法获取

mMobileDataEnabled = mConnService.getMobileDataEnabled();boolean值

  public boolean getMobileDataEnabled() {        try {            return mService.getMobileDataEnabled();        } catch (RemoteException e) {            return true;        }    }
   public boolean getMobileDataEnabled() {        // TODO: This detail should probably be in DataConnectionTracker's        //       which is where we store the value and maybe make this        //       asynchronous.        enforceAccessPermission();        boolean retVal = Settings.Global.getInt(mContext.getContentResolver(),                Settings.Global.MOBILE_DATA, 1) == 1;        if (VDBG) log("getMobileDataEnabled returning " + retVal);        return retVal;    }

MOBILE_DATA一样是DataBaseHelper创建的数据库中的字段,不同是他不是由bool值定义的,它SystemProperties一定的,如果没定义则默认返回false。

  // Mobile Data default, based on build            loadSetting(stmt, Settings.Global.MOBILE_DATA,                    "true".equalsIgnoreCase(                            SystemProperties.get("ro.com.android.mobiledata",                                    "false")) ? 1 : 0);
GPS:

设置中LocationSettings类。

    private boolean getAGPSSwitch() {        int enable = Settings.Global.getInt(mContentResolver,                Settings.Global.ASSISTED_GPS_ENABLED, AGPS_OFF);        return enable == AGPS_ON ? true : false;    }

      loadBooleanSetting(stmt, Settings.Global.ASSISTED_GPS_ENABLED,                    R.bool.assisted_gps_enabled);



















更多相关文章

  1. Android(安卓)ListView列表视图的使用方法
  2. RecyclerView 局部刷新、删除错乱
  3. 用Classpy分析.dex文件
  4. android 桌面组件 App widget的使用
  5. Android中获取字符串长度、宽度(所占像素宽度)
  6. Android非正常结束时的生命周期
  7. android Service--服务
  8. 【实践驱动开发3-004】TI WL1835MODCOM8 在android的移植 - 系统
  9. Android(安卓)Studio最常用快捷键

随机推荐

  1. 如何“任性”使用Android的drawText()
  2. Android(安卓)opengl 立方体 多纹理
  3. 详解Android中AsyncTask的使用
  4. Android Studio常用快捷键
  5. Android 隐藏/显示 Actionbar之后不能运
  6. android studio 新建 activity 失败
  7. GitHub 优秀的 Android 开源项目 淘宝技
  8. Android实现图表绘制和展示zz
  9. android:windowSoftInputMode 属性介绍
  10. Android系统启动流程 - 1