android 屏幕亮度调度时期详解

屏幕亮度自动调度:主如若从Sensor分析之均分离出来分析LIGHT 后光感应器,因此就分析一下自动调度屏幕亮度(手机跟着后光的强度自我调度,也即是在亮的后光下屏幕自动调亮一些,暗的时期就自动调暗一些,省得后光对眼睛有刺激).....

    (本东谈主从历经闭塞才八成了解过程),咫尺就脱手讲一下过程,如果有折柳所在但愿牛东谈主指出来。。。

    先从Sttings脱手吧,在diaplay中有屏幕亮度调度,有一个进程调,上头有一个checkbox(自动调度屏幕亮度的),那么咱们虽然去找settings下的文献脱手看了,先找到DiaplaySettings.java文献以及display_setting.xml文献,display_setting.xml内部能找到相应的组件,然而 在DiaplaySettings.java文献中却不成找到调用相应组件的代码,

那么咱们再到settings中去找,能找到BrightnessPreference.java文献,没错这个文献即是自动调度亮度的文献,咱们先望望代码:构造函数中有mAutomaticAvailable = context.getResources().getBoolean(com.android.internal.R.bool.config_automatic_brightness_available);脱手合计mAutomaticAvailabl的值(为true,在config.xml中)是判断是否自动调度亮度,因为在我跟进到PowerManagerService.java中,在initInThread() 中  mUseSoftwareAutoBrightness = resources.getBoolean(                com.android.internal.R.bool.config_automatic_brightness_available);        if (mUseSoftwareAutoBrightness) {            mAutoBrightnessLevels = resources.getIntArray(                    com.android.internal.R.array.config_autoBrightnessLevels);//得到自动化调度的值调用 getAutoBrightnessValue(int sensorValue, int[] values) 时期            mLcdBacklightValues = resources.getIntArray(                    com.android.internal.R.array.config_autoBrightnessLcdBacklightValues);            mButtonBacklightValues = resources.getIntArray(                    com.android.internal.R.array.config_autoBrightnessButtonBacklightValues);            mKeyboardBacklightValues = resources.getIntArray(。。。。。。。。。。。这里看起来好像是当mUseSoftwareAutoBrightness为true时就取得config.xml文献config_autoBrightnessLevels的值,再去把柄后光自动调度,然而mAutomaticAvailabl的值仅仅阐发有莫得自动调度屏幕的功能(比如说你将config.xml文献的config_automatic_brightness_available的值改为false,编译替换framework-res.apk那么在屏幕亮度调度中将莫得自动调度的checkbox),这也能阐扬构造函数一脱手就运行化mAutomaticAvailabl的值。

接下来在BrightnessPreference.java文献中有onProgressChanged,onStartTrackingTouch(SeekBar seekBar),onStopTrackingTouch(SeekBar seekBar)时期,这些一看也能懂就不先容了,在onBindDialogView(View view)时期中有mCheckBox = (CheckBox)view.findViewById(R.id.automatic_mode);        if (mAutomaticAvailable) {//当有自动调度功能            mCheckBox.setOnCheckedChangeListener(this);//为checkbox添加监听事件            try {                mOldAutomatic = Settings.System.getInt(getContext().getContentResolver(),                        Settings.System.SCREEN_BRIGHTNESS_MODE);。。。。。。主要看public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {        setMode(isChecked ? Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC                : Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);        if (!isChecked) {            setBrightness(mSeekBar.getProgress() + MINIMUM_BACKLIGHT);        }    }这里才是你汲取自动调度亮度的checkbox,如果汲取则setMode(Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);并将数据存放到数据库中。

这里是重心:这里有个数据库,当监测到数据库中的值发生更正时也即是变为Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC时,就会跳到powerManagerService.java的initInThread()中ContentResolver resolver = mContext.getContentResolver();        Cursor settingsCursor = resolver.query(Settings.System.CONTENT_URI, null,                "(" + Settings.System.NAME + "=?) or ("                        + Settings.System.NAME + "=?) or ("                        + Settings.System.NAME + "=?) or ("                        + Settings.System.NAME + "=?) or ("                        + Settings.System.NAME + "=?) or ("                        + Settings.System.NAME + "=?) or ("                        + Settings.System.NAME + "=?)",                new String[]{STAY_ON_WHILE_PLUGGED_IN, SCREEN_OFF_TIMEOUT, DIM_SCREEN, XEC_DLS_CONTROL,                        SCREEN_BRIGHTNESS_MODE, WINDOW_ANIMATION_SCALE, TRANSITION_ANIMATION_SCALE},                null);        mSettings = new ContentQueryMap(settingsCursor, Settings.System.NAME, true, mHandler);        SettingsObserver settingsObserver = new SettingsObserver();        mSettings.addObserver(settingsObserver);数据库中数据发生更正时触发事件的发生。

在 powerManagerService.java的systemReady()(只在开机调用一次就不再调用)中 if (mUseSoftwareAutoBrightness) {            Log.i("frist","frist="+"aaaa");            mLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);            enableLightSensor(true);        }而mUseSoftwareAutoBrightness是在initInThread()线程中取得了true值,那么就到enableLightSensor(true);时期去看 if (enable) {                    mSensorManager.registerListener(mLightListener, mLightSensor,                            SensorManager.SENSOR_DELAY_NORMAL);                }如果传递来的值为true也即是enable=true就监听况且用匹配屏幕标的变化的感应SENSOR_DELAY_NORMAL。再看mLightListener事件:SensorEventListener mLightListener = new SensorEventListener() {        public void onSensorChanged(SensorEvent event) {            synchronized (mLocks) {                int value = (int)event.values[0];//从event内部赢恰现时数据                Log.i("value","value="+value);                       long milliseconds = SystemClock.elapsedRealtime();                if (mDebugLightSensor) {                    Slog.d(TAG, "onSensorChanged: light value: " + value);                }                mHandler.removeCallbacks(mAutoBrightnessTask);                if (mLightSensorValue != value) {//mLightSensorValue是现时的屏幕亮度                    if (mLightSensorValue == -1


  • 上一篇:没有了
  • 下一篇:没有了


Powered by AlchemyPay Information Station @2013-2022 RSS地图 HTML地图

Copyright 365站群 © 2024MOLI TOP1