Android屏幕亮度调节

32 篇文章 0 订阅
29 篇文章 16 订阅

平时通过一个slider调节改变屏幕亮度,其实这个slider是systemui的东西,叫做BrightnessDialog

public class BrightnessDialog extends Activity {
    ....
    private BrightnessController mBrightnessController;
    @Override
      protected void onStart() {
        super.onStart();
        // mBrightnessController是BrightnessController类型的
        mBrightnessController.registerCallbacks();
    }
    ....

}

进一步会通过BrightnessController

public class BrightnessController implements ToggleSlider.Listener {
    ....
    public void registerCallbacks() {
        ....
        //
        mControl.setOnChangedListener(this);
    }
    ....



    @Override
    public void onChanged(ToggleSlider view, boolean tracking, boolean automatic, int value,
            boolean stopTracking) {
        mTracking = tracking;
        updateIcon(mAutomatic);
        if (mExternalChange) return;
        // 如果不是自动亮度,即用户手动设置的亮度
        if (!mAutomatic) {
            final int val = value + mMinimumBacklight;
            if (stopTracking) {
                MetricsLogger.action(mContext, MetricsLogger.ACTION_BRIGHTNESS, val);
            }
            // 设置当前手机屏幕亮度
            setBrightness(val);
            // 存储当前手机屏幕亮度的值到数据库中
            if (!tracking) {
                AsyncTask.execute(new Runnable() {
                        public void run() {
                            Settings.System.putIntForUser(mContext.getContentResolver(),
                                    Settings.System.SCREEN_BRIGHTNESS, val,
                                    UserHandle.USER_CURRENT);
                        }
                    });
            }
        } else {
            // 自动亮度,计算出自动亮度值,然后通过setBrightnessAdj进行设置
            final float adj = value / ((mMaximumBacklight - mMinimumBacklight) / 2f) - 1;
            if (stopTracking) {
                MetricsLogger.action(mContext, MetricsLogger.ACTION_BRIGHTNESS_AUTO, value);
            }
            setBrightnessAdj(adj);
            if (!tracking) {
                AsyncTask.execute(new Runnable() {
                    public void run() {
                        Settings.System.putFloatForUser(mContext.getContentResolver(),
                                Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, adj,
                                UserHandle.USER_CURRENT);
                    }
                });
            }
        }
        // 回调所有实现BrightnessStateChangeCallback接口的监听
        for (BrightnessStateChangeCallback cb : mChangeCallbacks) {
            cb.onBrightnessLevelChanged();
        }
    }


    private void setBrightness(int brightness) {
        try {
            // mPower是一个IPowerManager接口,最终实现是在PowerManagerService
            mPower.setTemporaryScreenBrightnessSettingOverride(brightness);
        } catch (RemoteException ex) {
        }
    }

}

可以看到,在BrightnessController#onChanged 回调中,调用了自己的setBrightness方法,并且最终通过PowerManagerService#setTemporaryScreenBrightnessSettingOverride实现

PowerManagerService#setTemporaryScreenBrightnessSettingOverride
@Override // Binder call
public void setTemporaryScreenBrightnessSettingOverride(int brightness) {
            // 检查当前调用是否有android.Manifest.permission.DEVICE_POWER权限,如果没有,则抛出SecurityException
            mContext.enforceCallingOrSelfPermission(
                    android.Manifest.permission.DEVICE_POWER, null);

            final long ident = Binder.clearCallingIdentity();
            try {
                // 通过setTemporaryScreenBrightnessSettingOverrideInternal方法设置屏幕亮度
                setTemporaryScreenBrightnessSettingOverrideInternal(brightness);
            } finally {
                Binder.restoreCallingIdentity(ident);
            }
}


private void setTemporaryScreenBrightnessSettingOverrideInternal(int brightness) {
        synchronized (mLock) {
            // 屏幕亮度发生改变的时候调用
            if (mTemporaryScreenBrightnessSettingOverride != brightness) {
                // 设置新的屏幕亮度,后面在更新屏幕亮度中会用到
                mTemporaryScreenBrightnessSettingOverride = brightness;
                mDirty |= DIRTY_SETTINGS;
                // 改变当前屏幕亮度
                updatePowerStateLocked();
            }
        }
}




private void updatePowerStateLocked() {
        ....
        try {
            // 设置屏幕显示
            boolean displayBecameReady = updateDisplayPowerStateLocked(dirtyPhase2);

        } finally {
        }
        ....
}


private boolean updateDisplayPowerStateLocked(int dirty) {
        final boolean oldDisplayReady = mDisplayReady;
        if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_USER_ACTIVITY | DIRTY_WAKEFULNESS
                | DIRTY_ACTUAL_DISPLAY_POWER_STATE_UPDATED | DIRTY_BOOT_COMPLETED
                | DIRTY_SETTINGS | DIRTY_SCREEN_BRIGHTNESS_BOOST)) != 0) {
            ....
            boolean autoBrightness = (mScreenBrightnessModeSetting ==
                    Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
            if (isValidBrightness(mScreenBrightnessOverrideFromWindowManager)) {
                screenBrightness = mScreenBrightnessOverrideFromWindowManager;
                autoBrightness = false;
                brightnessSetByUser = false;
            } else if (isValidBrightness(mTemporaryScreenBrightnessSettingOverride)) {
                // 用户自己设置的屏幕亮度值
                screenBrightness = mTemporaryScreenBrightnessSettingOverride;
            } else if (isValidBrightness(mScreenBrightnessSetting)) {
                screenBrightness = mScreenBrightnessSetting;
            }
            if (autoBrightness) { //如果是自动亮度
                ....
            }
            screenBrightness = Math.max(Math.min(screenBrightness,
                    mScreenBrightnessSettingMaximum), mScreenBrightnessSettingMinimum);
            // 将新的屏幕亮度值赋值给mDisplayPowerRequest.screenBrightness
            mDisplayPowerRequest.screenBrightness = screenBrightness;

            // 进一步通过mDisplayManagerInternal请求改变当前的power状态
            mDisplayReady = mDisplayManagerInternal.requestPowerState(mDisplayPowerRequest,
                    mRequestWaitForNegativeProximity);
        }
        return mDisplayReady && !oldDisplayReady;
}

这里的mDisplayManagerInternal是什么呢,可以看到它是DisplayManagerInternal类,是一个抽象类

public abstract class DisplayManagerInternal {

}

那么它的实现在哪里?还记得我们手机开机的时候所有的系统服务都是由SystemServer来启动的,其中在startBootstrapServices中启动了DisplayManagerService

 mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);

接着DisplayManagerService#onStart会被执行

@Override
public void onStart() {
        mHandler.sendEmptyMessage(MSG_REGISTER_DEFAULT_DISPLAY_ADAPTER);

        publishBinderService(Context.DISPLAY_SERVICE, new BinderService(),
                true /*allowIsolated*/);
        // DisplayManagerInternal对应的是LocalService服务
        publishLocalService(DisplayManagerInternal.class, new LocalService());
}

从上面代码可以看出DisplayManagerInternal对应的是LocalService服务,LocalService是DisplayManagerService的一个内部类,继承自DisplayManagerInternal

private final class LocalService extends DisplayManagerInternal {
    
    @Override
        public void initPowerManagement(final DisplayPowerCallbacks callbacks, Handler handler,
                SensorManager sensorManager) {
            synchronized (mSyncRoot) {
                DisplayBlanker blanker = new DisplayBlanker() {
                    @Override
                    public void requestDisplayState(int state, int brightness, int brightnessMode) {
                        // The order of operations is important for legacy reasons.
                        if (state == Display.STATE_OFF) {
                            requestGlobalDisplayStateInternal(state, brightness, brightnessMode);
                        }

                        callbacks.onDisplayStateChange(state);

                        if (state != Display.STATE_OFF) {
                            requestGlobalDisplayStateInternal(state, brightness, brightnessMode);
                        }
                    }
                };
                mDisplayPowerController = new DisplayPowerController(
                        mContext, callbacks, handler, sensorManager, blanker);
            }
        }


    ....
    @Override
    public boolean requestPowerState(DisplayPowerRequest request,
                boolean waitForNegativeProximity) {
            // mDisplayPowerController是DisplayPowerController类型
            return mDisplayPowerController.requestPowerState(request,
                    waitForNegativeProximity);
    }
    ....

}

接着看下DisplayPowerController#requestPowerState方法:

public boolean requestPowerState(DisplayPowerRequest request,
            boolean waitForNegativeProximity) {

        synchronized (mLock) {
            boolean changed = false;

            ....
            if (changed && !mPendingRequestChangedLocked) {
                mPendingRequestChangedLocked = true;
                sendUpdatePowerStateLocked();
            }

            return mDisplayReadyLocked;
        }
}



private void sendUpdatePowerStateLocked() {
        if (!mPendingUpdatePowerStateLocked) {
            mPendingUpdatePowerStateLocked = true;
            Message msg = mHandler.obtainMessage(MSG_UPDATE_POWER_STATE);
            msg.setAsynchronous(true);
            mHandler.sendMessage(msg);
        }
}

发送"MSG_UPDATE_POWER_STATE"消息,DisplayControllerHandler是DisplayPowerController的一个内部handler

private final class DisplayControllerHandler extends Handler {
        public DisplayControllerHandler(Looper looper) {
            super(looper, null, true /*async*/);
        }

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case MSG_UPDATE_POWER_STATE:
                    updatePowerState();
                    break;
                ....
            }
        }
}

private void updatePowerState() {

        ....
        // If need to set the screen brightness immediately,
        // set the brightness and the brightness mode here.
        if (mSetBrightnessImmediatelyAtNextRequest) {
            if (DEBUG) {
                Slog.d(TAG, "Setting the screen brightness immediately:"
                    + brightness);
            }
            mPowerState.setScreenBrightnessAndBrightnessMode(
                    brightness,
                    hardwareAutoBrightnessEnabled ?
                    Light.BRIGHTNESS_MODE_SENSOR : Light.BRIGHTNESS_MODE_USER);
        }
        ....

        if (!mPendingScreenOff) {
            if (!mSetBrightnessImmediatelyAtNextRequest
                && (state == Display.STATE_ON || state == Display.STATE_DOZE)) {
                // 动态调整屏幕亮度
                animateScreenBrightness(brightness,
                        slowChange ? BRIGHTNESS_RAMP_RATE_SLOW : BRIGHTNESS_RAMP_RATE_FAST);
            } else {
                animateScreenBrightness(brightness, 0);
                mSetBrightnessImmediatelyAtNextRequest = false;
            }
        }

}




public void setScreenBrightnessAndBrightnessMode(int brightness, int brightnessMode) {
        if (mScreenBrightness != brightness || mBrightnessMode != brightnessMode) {

            mScreenBrightness = brightness;
            mBrightnessMode = brightnessMode;
            if (mScreenState != Display.STATE_OFF) {
                mScreenReady = false;
                scheduleScreenUpdate();
            }
        }
}

private void scheduleScreenUpdate() {
        if (!mScreenUpdatePending) {
            mScreenUpdatePending = true;
            postScreenUpdateThreadSafe();
        }
}

private void postScreenUpdateThreadSafe() {
        mHandler.removeCallbacks(mScreenUpdateRunnable);
        mHandler.post(mScreenUpdateRunnable);
}



private final Runnable mScreenUpdateRunnable = new Runnable() {
        @Override
        public void run() {
            mScreenUpdatePending = false;

            int brightness = mScreenState != Display.STATE_OFF
                    && mColorFadeLevel > 0f ? mScreenBrightness : 0;
            // 调用了setState方法,mPhotonicModulator是PhotonicModulator类型,是一个线程
            if (mPhotonicModulator.setState(mScreenState, brightness, mBrightnessMode)) {
                mScreenReady = true;
                invokeCleanListenerIfNeeded();
            } else {
              
            }
        }
};

看下PhotonicModulator线程

private final class PhotonicModulator extends Thread {
        private static final int INITIAL_SCREEN_STATE = Display.STATE_OFF; // unknown, assume off
        private final Object mLock = new Object();
        private boolean mChangeInProgress;

        public PhotonicModulator() {
            super("PhotonicModulator");
        }

        public boolean setState(int state, int backlight, int brightnessMode) {
            synchronized (mLock) {
                if (state != mPendingState || backlight != mPendingBacklight ||
                        brightnessMode != mPendingBrightnessMode) {

                    mPendingState = state;
                    mPendingBacklight = backlight;
                    mPendingBrightnessMode = brightnessMode;

                    if (!mChangeInProgress) {
                        mChangeInProgress = true;
                        // 当亮度发生改变完成以后,通过notifyAll唤醒处于等待的所有线程,包括自己,
                        // 此时就会继续走之前"mLock.wait();"下面的代码,通过mBlanker.requestDisplayState实现屏幕亮度变化
                        mLock.notifyAll();
                    }
                }
                return !mChangeInProgress;
            }
        }

          @Override
        public void run() {
            for (;;) {
                // Get pending change.
                final int state;
                final boolean stateChanged;
                final int backlight;
                final boolean backlightChanged;
                final int brightnessMode;
                final boolean brightnessModeChanged;
                synchronized (mLock) {
                    state = mPendingState;
                    stateChanged = (state != mActualState);
                    backlight = mPendingBacklight;
                    backlightChanged = (backlight != mActualBacklight);
                    brightnessMode = mPendingBrightnessMode;
                    brightnessModeChanged = (brightnessMode != mActualBrightnessMode);
                    if (!stateChanged && !backlightChanged && !brightnessModeChanged) {
                        // All changed applied, notify outer class and wait for more.
                        mChangeInProgress = false;
                        postScreenUpdateThreadSafe();
                        // 如果没有发生改变,则当前线程处于等待状态,下面的代码也是不会执行的
                        try {
                            mLock.wait();
                        } catch (InterruptedException ex) { }
                        continue;
                    }
                    mActualState = state;
                    mActualBacklight = backlight;
                    mActualBrightnessMode = brightnessMode;
                }
                // 通过mBlanker.requestDisplayState来实现页面亮度改变     
                mBlanker.requestDisplayState(state, backlight, brightnessMode);
            }
        }
}

这里,可以看到,在mScreenUpdateRunnable线程中调用了PhotonicModulator#setState来唤醒所有处于等待状态的线程,包括它自己,PhotonicModulator是在DisplayPowerState的构造方法中就已经启动了,
好了现在看下mBlanker.requestDisplayState,可是发现mBlanker对应的DisplayBlanker是一个接口,那么肯定有它的实现类:

public interface DisplayBlanker {
    void requestDisplayState(int state, int brightness, int brightnessMode);
}

DisplayBlanker是在DisplayManagerService#onStart中绑定LocalService时候构造的

private final class LocalService extends DisplayManagerInternal {
        @Override
        public void initPowerManagement(final DisplayPowerCallbacks callbacks, Handler handler,
                SensorManager sensorManager) {
            synchronized (mSyncRoot) {
                DisplayBlanker blanker = new DisplayBlanker() {
                    @Override
                    public void requestDisplayState(int state, int brightness, int brightnessMode) {
                        // The order of operations is important for legacy reasons.
                        if (state == Display.STATE_OFF) {
                            requestGlobalDisplayStateInternal(state, brightness, brightnessMode);
                        }
                        // 调用了PowerManagerService中的onDisplayStateChange
                        callbacks.onDisplayStateChange(state); 

                        if (state != Display.STATE_OFF) {
                            requestGlobalDisplayStateInternal(state, brightness, brightnessMode);
                        }
                    }
                };
                mDisplayPowerController = new DisplayPowerController(
                        mContext, callbacks, handler, sensorManager, blanker);
            }
        }
}



@Override
public void onDisplayStateChange(int state) {
            // This method is only needed to support legacy display blanking behavior
            // where the display's power state is coupled to suspend or to the power HAL.
            // The order of operations matters here.
            synchronized (mLock) {
                if (mDisplayState != state) {
                    mDisplayState = state;
                    if (state == Display.STATE_OFF) {
                        if (!mDecoupleHalInteractiveModeFromDisplayConfig) {
                            setHalInteractiveModeLocked(false);
                        }
                        if (!mDecoupleHalAutoSuspendModeFromDisplayConfig) {
                            setHalAutoSuspendModeLocked(true);
                        }
                    } else {
                        if (!mDecoupleHalAutoSuspendModeFromDisplayConfig) {
                            setHalAutoSuspendModeLocked(false);
                        }
                        if (!mDecoupleHalInteractiveModeFromDisplayConfig) {
                            setHalInteractiveModeLocked(true);
                        }
                    }
                }
            }
}

其中setHalInteractiveModeLocked是一个native函数,设置屏幕是否亮。

接着继续看下updatePowerState中animateScreenBrightness动态调整屏幕亮度的过程

private void animateScreenBrightness(int target, float rate) {
        if (mScreenBrightnessRampAnimator.animateTo(target, rate)) {//泛型技术,最后调用了DisplayPowerState的setScreenBrightness函数
            try {
                mBatteryStats.noteScreenBrightness(target);
            } catch (RemoteException ex) {
                // same process
            }
        }
}

最终程序会走到LightsService$LightImpl类中

public class LightsService extends SystemService {
    
    private final class LightImpl extends Light {

        @Override
        public void setBrightnessForce(int brightness, int brightnessMode) {
            synchronized (this) {
                int color = brightness & 0x000000ff;
                color = 0xff000000 | (color << 16) | (color << 8) | color;
                setLightLocked(color, LIGHT_FLASH_NONE, 0, 0, brightnessMode, true);
            }
        }

        ....
         private void setLightLocked(int color, int mode, int onMS, int offMS, int brightnessMode, boolean force) {
            if (color != mColor || mode != mMode || onMS != mOnMS || offMS != mOffMS
                    || brightnessMode != mBrightnessMode || force) {
                mColor = color;
                mMode = mode;
                mOnMS = onMS;
                mOffMS = offMS;
                Trace.traceBegin(Trace.TRACE_TAG_POWER, "setLight(" + mId + ", 0x"
                        + Integer.toHexString(color) + ")");
                mBrightnessMode = brightnessMode;
                try {
                    if (mAllowSetLight) {
                        // 设置当前屏幕亮度
                        setLight_native(mNativePointer, mId, color, mode, onMS, offMS, brightnessMode);
                    }
                } finally {
                    Trace.traceEnd(Trace.TRACE_TAG_POWER);
                }
            }
        }
        ....
    }

}


欢 迎 关 注 我 的 公 众 号 “编 程 大 全”

专注技术分享,包括Java,python,AI人工智能,Android分享,不定期更新学习视频
在这里插入图片描述

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值