http://blog.csdn.net/kc58236582/article/details/51582950
这是第一篇文章,博主后续还有一篇文章,
在下面这篇的基础上补充上了DisplayPowerController部分,两篇一起看更好
http://blog.csdn.net/thinkinwm/article/details/51958048
之前android5.1我们分析过power,但是那篇博客从整体分析显得有些杂乱,这几篇博客都从power的功能来分析,个人觉得更好理解。
一、PowerManagerService的显示相关函数
由于之前博客都分析过,我们就直接进入PowerManagerService的和显示相关的主体:
updateDisplayPowerStateLocked函数:
- 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) {
- mDisplayPowerRequest.policy = getDesiredScreenPolicyLocked();//根据PowerManager的mWakefulness返回状态
- // Determine appropriate screen brightness and auto-brightness adjustments.
- boolean brightnessSetByUser = true;
- int screenBrightness = mScreenBrightnessSettingDefault;
- float screenAutoBrightnessAdjustment = 0.0f;
- 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 = mScreenBrightnessSettingDefault;
- if (isValidAutoBrightnessAdjustment(
- mTemporaryScreenAutoBrightnessAdjustmentSettingOverride)) {
- screenAutoBrightnessAdjustment =
- mTemporaryScreenAutoBrightnessAdjustmentSettingOverride;
- } else if (isValidAutoBrightnessAdjustment(
- mScreenAutoBrightnessAdjustmentSetting)) {
- screenAutoBrightnessAdjustment = mScreenAutoBrightnessAdjustmentSetting;
- }
- }
- screenBrightness = Math.max(Math.min(screenBrightness,
- mScreenBrightnessSettingMaximum), mScreenBrightnessSettingMinimum);
- screenAutoBrightnessAdjustment = Math.max(Math.min(
- screenAutoBrightnessAdjustment, 1.0f), -1.0f);
- // Update display power request.
- mDisplayPowerRequest.screenBrightness = screenBrightness;
- mDisplayPowerRequest.screenAutoBrightnessAdjustment =
- screenAutoBrightnessAdjustment;
- mDisplayPowerRequest.brightnessSetByUser = brightnessSetByUser;
- mDisplayPowerRequest.useAutoBrightness = autoBrightness;
- mDisplayPowerRequest.useProximitySensor = shouldUseProximitySensorLocked();//距离传感器相关
- mDisplayPowerRequest.lowPowerMode = mLowPowerModeEnabled;//低功耗模式
- mDisplayPowerRequest.boostScreenBrightness = mScreenBrightnessBoostInProgress;//屏幕最亮
- if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_DOZE) {
- mDisplayPowerRequest.dozeScreenState = mDozeScreenStateOverrideFromDreamManager;
- if (mDisplayPowerRequest.dozeScreenState == Display.STATE_DOZE_SUSPEND
- && (mWakeLockSummary & WAKE_LOCK_DRAW) != 0) {
- mDisplayPowerRequest.dozeScreenState = Display.STATE_DOZE;
- }
- mDisplayPowerRequest.dozeScreenBrightness =
- mDozeScreenBrightnessOverrideFromDreamManager;
- } else {
- mDisplayPowerRequest.dozeScreenState = Display.STATE_UNKNOWN;
- mDisplayPowerRequest.dozeScreenBrightness = PowerManager.BRIGHTNESS_DEFAULT;
- }
- mDisplayReady = mDisplayManagerInternal.requestPowerState(mDisplayPowerRequest,//调用DisplayPowerController的函数
- mRequestWaitForNegativeProximity);
- mRequestWaitForNegativeProximity = false;
- return mDisplayReady && !oldDisplayReady;
- }
我们先看看getDesiredScreenPolicyLocked函数,就是根据现在PowerManager中mWakefulness的状态返回各个值。
- private int getDesiredScreenPolicyLocked() {
- if (mWakefulness == WAKEFULNESS_ASLEEP) {
- return DisplayPowerRequest.POLICY_OFF;
- }
- if (mWakefulness == WAKEFULNESS_DOZING) {
- if ((mWakeLockSummary & WAKE_LOCK_DOZE) != 0) {
- return DisplayPowerRequest.POLICY_DOZE;
- }
- if (mDozeAfterScreenOffConfig) {
- return DisplayPowerRequest.POLICY_OFF;
- }
- // Fall through and preserve the current screen policy if not configured to
- // doze after screen off. This causes the screen off transition to be skipped.
- }
- if ((mWakeLockSummary & WAKE_LOCK_SCREEN_BRIGHT) != 0
- || (mUserActivitySummary & USER_ACTIVITY_SCREEN_BRIGHT) != 0
- || !mBootCompleted
- || mScreenBrightnessBoostInProgress) {
- return DisplayPowerRequest.POLICY_BRIGHT;
- }
- return DisplayPowerRequest.POLICY_DIM;
- }
我们先来看看DisplayManagerService中下面的LocalService,在PowerManagerService中先调用了initPowerManagement,然后在上面函数中调用了requestPowerState函数,最后等于调用了DisplayPowerController的requestPowerState接口。
- 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) {
- // The order of operations is important for legacy reasons.
- if (state == Display.STATE_OFF) {
- requestGlobalDisplayStateInternal(state, brightness);
- }
- callbacks.onDisplayStateChange(state);
- if (state != Display.STATE_OFF) {
- requestGlobalDisplayStateInternal(state, brightness);
- }
- }
- };
- mDisplayPowerController = new DisplayPowerController(
- mContext, callbacks, handler, sensorManager, blanker);
- }
- }
- @Override
- public boolean requestPowerState(DisplayPowerRequest request,
- boolean waitForNegativeProximity) {
- return mDisplayPowerController.requestPowerState(request,
- waitForNegativeProximity);
- }
这里我们还得注意在PowerManagerService调用LocalService的initPowerManagement接口时,传入的几个参数,后面会分析到。
二、DisplayPowerController
我们先来看DisplayPowerController的构造函数,先将传入的参数保存起来,我们看传入的handler是从PowerManagerService中传过来的,说明DisplayPowerController的消息处理线程是在PowerManagerService中的,这个构造函数后面是各种参数的配置我们就不看了。
- public DisplayPowerController(Context context,
- DisplayPowerCallbacks callbacks, Handler handler,
- SensorManager sensorManager, DisplayBlanker blanker) {
- mHandler = new DisplayControllerHandler(handler.getLooper());
- mCallbacks = callbacks;
- mBatteryStats = BatteryStatsService.getService();
- mSensorManager = sensorManager;
- mWindowManagerPolicy = LocalServices.getService(WindowManagerPolicy.class);
- mBlanker = blanker;
- mContext = context;
- mPowerManager = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
下面我们来看requestPowerState函数:
- public boolean requestPowerState(DisplayPowerRequest request,
- boolean waitForNegativeProximity) {
- synchronized (mLock) {
- boolean changed = false;
- if (waitForNegativeProximity
- && !mPendingWaitForNegativeProximityLocked) {
- mPendingWaitForNegativeProximityLocked = true;
- changed = true;
- }
- if (mPendingRequestLocked == null) {//第一次过来
- mPendingRequestLocked = new DisplayPowerRequest(request);//把传过来的值保存在DisplayPowerRequest中
- changed = true;
- } else if (!mPendingRequestLocked.equals(request)) {
- mPendingRequestLocked.copyFrom(request);
- changed = true;
- }
- if (changed) {
- mDisplayReadyLocked = false;//还没准备好
- }
- if (changed && !mPendingRequestChangedLocked) {//第一次调用mPendingRequestChangedLocked为false
- mPendingRequestChangedLocked = true;//置true了
- sendUpdatePowerStateLocked();
- }
- return mDisplayReadyLocked;
- }
- }
sendUpdatePowerStateLocked就是发送了MSG_UPDATE_POWER_STATE消息
- private void sendUpdatePowerStateLocked() {
- if (!mPendingUpdatePowerStateLocked) {
- mPendingUpdatePowerStateLocked = true;
- Message msg = mHandler.obtainMessage(MSG_UPDATE_POWER_STATE);
- msg.setAsynchronous(true);
- mHandler.sendMessage(msg);
- }
- }
这个消息处理就是调用了updatePowerState函数:
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_UPDATE_POWER_STATE:
- updatePowerState();
- break;
- case MSG_PROXIMITY_SENSOR_DEBOUNCED:
- debounceProximitySensor();
- break;
- case MSG_SCREEN_ON_UNBLOCKED:
- if (mPendingScreenOnUnblocker == msg.obj) {
- unblockScreenOn();
- updatePowerState();
- }
- break;
- }
- }
updatePowerState函数:
- private void updatePowerState() {
- // Update the power state request.
- final boolean mustNotify;
- boolean mustInitialize = false;
- boolean autoBrightnessAdjustmentChanged = false;
- synchronized (mLock) {
- mPendingUpdatePowerStateLocked = false;
- if (mPendingRequestLocked == null) {//不为null
- return; // wait until first actual power request
- }
- if (mPowerRequest == null) {//第一次
- mPowerRequest = new DisplayPowerRequest(mPendingRequestLocked);
- mWaitingForNegativeProximity = mPendingWaitForNegativeProximityLocked;
- mPendingWaitForNegativeProximityLocked = false;
- mPendingRequestChangedLocked = false;
- mustInitialize = true;
- } else if (mPendingRequestChangedLocked) {
- autoBrightnessAdjustmentChanged = (mPowerRequest.screenAutoBrightnessAdjustment
- != mPendingRequestLocked.screenAutoBrightnessAdjustment);
- mPowerRequest.copyFrom(mPendingRequestLocked);
- mWaitingForNegativeProximity |= mPendingWaitForNegativeProximityLocked;
- mPendingWaitForNegativeProximityLocked = false;
- mPendingRequestChangedLocked = false;
- mDisplayReadyLocked = false;
- }
- mustNotify = !mDisplayReadyLocked;
- }
- // Initialize things the first time the power state is changed.
- if (mustInitialize) {//第一次调用
- initialize();
- }
我们来看看initialize函数,初始化了mPowerState
- private void initialize() {
- // Initialize the power state object for the default display.
- // In the future, we might manage multiple displays independently.
- mPowerState = new DisplayPowerState(mBlanker,
- new ColorFade(Display.DEFAULT_DISPLAY));
- mColorFadeOnAnimator = ObjectAnimator.ofFloat(
- mPowerState, DisplayPowerState.COLOR_FADE_LEVEL, 0.0f, 1.0f);
- mColorFadeOnAnimator.setDuration(COLOR_FADE_ON_ANIMATION_DURATION_MILLIS);
- mColorFadeOnAnimator.addListener(mAnimatorListener);
- mColorFadeOffAnimator = ObjectAnimator.ofFloat(
- mPowerState, DisplayPowerState.COLOR_FADE_LEVEL, 1.0f, 0.0f);
- mColorFadeOffAnimator.setDuration(COLOR_FADE_OFF_ANIMATION_DURATION_MILLIS);
- mColorFadeOffAnimator.addListener(mAnimatorListener);
- mScreenBrightnessRampAnimator = new RampAnimator<DisplayPowerState>(
- mPowerState, DisplayPowerState.SCREEN_BRIGHTNESS);
- mScreenBrightnessRampAnimator.setListener(mRampAnimatorListener);
- // Initialize screen state for battery stats.
- try {
- mBatteryStats.noteScreenState(mPowerState.getScreenState());
- mBatteryStats.noteScreenBrightness(mPowerState.getScreenBrightness());
- } catch (RemoteException ex) {
- // same process
- }
- }
继续分析updatePowerState函数:
- int state;
- int brightness = PowerManager.BRIGHTNESS_DEFAULT;
- boolean performScreenOffTransition = false;
- switch (mPowerRequest.policy) {
- case DisplayPowerRequest.POLICY_OFF:
- state = Display.STATE_OFF;
- performScreenOffTransition = true;
- break;
- case DisplayPowerRequest.POLICY_DOZE:
- if (mPowerRequest.dozeScreenState != Display.STATE_UNKNOWN) {
- state = mPowerRequest.dozeScreenState;
- } else {
- state = Display.STATE_DOZE;
- }
- if (!mAllowAutoBrightnessWhileDozingConfig) {
- brightness = mPowerRequest.dozeScreenBrightness;
- }
- break;
- case DisplayPowerRequest.POLICY_DIM:
- case DisplayPowerRequest.POLICY_BRIGHT:
- default:
- state = Display.STATE_ON;
- break;
- }
- assert(state != Display.STATE_UNKNOWN);
上面根据传入的policy来决定state的状态,后面又调用了
- animateScreenStateChange(state, performScreenOffTransition);
- state = mPowerState.getScreenState();
。。。
- if (!mPendingScreenOff) {
- if (state == Display.STATE_ON || state == Display.STATE_DOZE) {
- animateScreenBrightness(brightness,
- slowChange ? BRIGHTNESS_RAMP_RATE_SLOW : BRIGHTNESS_RAMP_RATE_FAST);
- } else {
- animateScreenBrightness(brightness, 0);
- }
- }
三、DisplayPowerState
animateScreenStateChange函数最终会调用DisplayPowerState的setScreenState函数:
- public void setScreenState(int state) {
- if (mScreenState != state) {
- if (DEBUG) {
- Slog.d(TAG, "setScreenState: state=" + state);
- }
- mScreenState = state;
- mScreenReady = false;
- scheduleScreenUpdate();
- }
- }
而animateScreenBrightness通过泛型技术,这里我们就不说了,也最终调用了
- public void setScreenBrightness(int brightness) {
- if (mScreenBrightness != brightness) {
- if (DEBUG) {
- Slog.d(TAG, "setScreenBrightness: brightness=" + brightness);
- }
- mScreenBrightness = brightness;
- if (mScreenState != Display.STATE_OFF) {
- mScreenReady = false;
- scheduleScreenUpdate();
- }
- }
- }
我们再来看scheduleScreenUpdate函数最终通过异步的形式发送消息。
- private void scheduleScreenUpdate() {
- if (!mScreenUpdatePending) {
- mScreenUpdatePending = true;
- postScreenUpdateThreadSafe();
- }
- }
- private void postScreenUpdateThreadSafe() {
- mHandler.removeCallbacks(mScreenUpdateRunnable);
- mHandler.post(mScreenUpdateRunnable);
- }
我们再来看mScreenUpdateRunnable
- private final Runnable mScreenUpdateRunnable = new Runnable() {
- @Override
- public void run() {
- mScreenUpdatePending = false;
- int brightness = mScreenState != Display.STATE_OFF
- && mColorFadeLevel > 0f ? mScreenBrightness : 0;
- if (mPhotonicModulator.setState(mScreenState, brightness)) {
- if (DEBUG) {
- Slog.d(TAG, "Screen ready");
- }
- mScreenReady = true;
- invokeCleanListenerIfNeeded();
- } else {
- if (DEBUG) {
- Slog.d(TAG, "Screen not ready");
- }
- }
- }
- };
先调用了mPhotonicModulator.setState函数,我们来看下这个函数:
- public boolean setState(int state, int backlight) {
- synchronized (mLock) {
- boolean stateChanged = state != mPendingState;
- boolean backlightChanged = backlight != mPendingBacklight;
- if (stateChanged || backlightChanged) {
- if (DEBUG) {
- Slog.d(TAG, "Requesting new screen state: state="
- + Display.stateToString(state) + ", backlight=" + backlight);
- }
- mPendingState = state;// 状态
- mPendingBacklight = backlight;//亮度
- boolean changeInProgress = mStateChangeInProgress || mBacklightChangeInProgress;
- mStateChangeInProgress = stateChanged;
- mBacklightChangeInProgress = backlightChanged;
- if (!changeInProgress) {
- Slog.d(TAG,"notify set backlight thread run");
- mLock.notifyAll();
- }
- }
- return !mStateChangeInProgress;
- }
- }
而这个PhotonicModulator其实是个线程,在DisplayPowerState构造函数中就开启了这个线程:
- public void run() {
- for (;;) {
- // Get pending change.
- final int state;
- final boolean stateChanged;
- final int backlight;
- final boolean backlightChanged;
- synchronized (mLock) {
- state = mPendingState;
- stateChanged = (state != mActualState);
- backlight = mPendingBacklight;
- backlightChanged = (backlight != mActualBacklight);
- if (!stateChanged) {
- // State changed applied, notify outer class.
- postScreenUpdateThreadSafe();
- mStateChangeInProgress = false;
- }
- if (!backlightChanged) {
- mBacklightChangeInProgress = false;
- }
- if (!stateChanged && !backlightChanged) {
- try {
- mLock.wait();
- } catch (InterruptedException ex) { }
- continue;
- }
- mActualState = state;
- mActualBacklight = backlight;
- }
- // Apply pending change.
- if (true) {
- Slog.d(TAG, "Updating screen state: state="
- + Display.stateToString(state) + ", backlight=" + backlight);
- }
- mBlanker.requestDisplayState(state, backlight);
- }
- }
四、回调
最后调用了mBlanker.requestDisplayState函数,而这个blanker是从DisplayPowerController传过来的。最终我们看
- public void initPowerManagement(final DisplayPowerCallbacks callbacks, Handler handler,
- SensorManager sensorManager) {
- synchronized (mSyncRoot) {
- DisplayBlanker blanker = new DisplayBlanker() {
- @Override
- public void requestDisplayState(int state, int brightness) {
- // The order of operations is important for legacy reasons.
- if (state == Display.STATE_OFF) {
- requestGlobalDisplayStateInternal(state, brightness);
- }
- callbacks.onDisplayStateChange(state);
- if (state != Display.STATE_OFF) {
- requestGlobalDisplayStateInternal(state, brightness);
- }
- }
- };
- mDisplayPowerController = new DisplayPowerController(
- mContext, callbacks, handler, sensorManager, blanker);
- }
- }
是在DisplayManagerService中的initPowerManagement函数中初始化的,而我们现在真正设置节点亮度是放在DisplayManagerService中了,不像以前了。
我们再来看callbacks.onDisplayStateChange函数,是PowerManagerService的onDisplayStateChange也是一些设置。
- 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);
- }
- }
- }
- }
- }
最后我们再回到DisplayPowerController中的updatePowerState函数的最后一段代码:
- final boolean ready = mPendingScreenOnUnblocker == null
- && !mColorFadeOnAnimator.isStarted()
- && !mColorFadeOffAnimator.isStarted()
- && mPowerState.waitUntilClean(mCleanListener);
- final boolean finished = ready
- && !mScreenBrightnessRampAnimator.isAnimating();
- // Notify policy about screen turned on.
- if (ready && state != Display.STATE_OFF
- && mReportedScreenStateToPolicy == REPORTED_TO_POLICY_SCREEN_TURNING_ON) {
- mReportedScreenStateToPolicy = REPORTED_TO_POLICY_SCREEN_ON;
- mWindowManagerPolicy.screenTurnedOn();
- }
- // Grab a wake lock if we have unfinished business.
- if (!finished && !mUnfinishedBusiness) {//没有完成
- if (DEBUG) {
- Slog.d(TAG, "Unfinished business...");
- }
- mCallbacks.acquireSuspendBlocker();//持锁,PowerManagerService的回调
- mUnfinishedBusiness = true;
- }
- // Notify the power manager when ready.
- if (ready && mustNotify) {
- // Send state change.
- synchronized (mLock) {
- if (!mPendingRequestChangedLocked) {
- mDisplayReadyLocked = true;
- if (DEBUG) {
- Slog.d(TAG, "Display ready!");
- }
- }
- }
- sendOnStateChangedWithWakelock();
- }
- // Release the wake lock when we have no unfinished business.
- if (finished && mUnfinishedBusiness) {
- if (DEBUG) {
- Slog.d(TAG, "Finished business...");
- }
- mUnfinishedBusiness = false;
- mCallbacks.releaseSuspendBlocker();//完成释放锁
- }
ready这个变量非常重要,直接说明DisplayPowerController是否准备好,我们看这个ready变量和DisplayPowerState的waitUntilClean相关
- public boolean waitUntilClean(Runnable listener) {
- if (!mScreenReady || !mColorFadeReady) {
- mCleanListener = listener;
- return false;
- } else {
- mCleanListener = null;
- return true;
- }
- }
只有到mScreenReady才会返回true,而这个变量是在之前setScreenState和setScreenBrightness函数中异步发送消息,才会调用。
补充:原文里面没有提到waitUntilClean被调用时,屏幕还没有完成更新,所以mScreenReady为false,
所以这里会向mCleanListener注册的这个回调,这个回调的作用是等待DisplayPowerState中mPhotonicModulator线程
更新状态mScreenReady为true,然后进入invokeCleanListenerIfNeeded调用mCleanListener,这样会再次进入到
DisplayPowerController.updatePowerState函数,从而打通DisplayPowerState更新过程
- private final Runnable mScreenUpdateRunnable = new Runnable() {
- @Override
- public void run() {
- mScreenUpdatePending = false;
- int brightness = mScreenState != Display.STATE_OFF
- && mColorFadeLevel > 0f ? mScreenBrightness : 0;
- if (mPhotonicModulator.setState(mScreenState, brightness)) {
- if (DEBUG) {
- Slog.d(TAG, "Screen ready");
- }
- mScreenReady = true;
- invokeCleanListenerIfNeeded();
- } else {
- if (DEBUG) {
- Slog.d(TAG, "Screen not ready");
- }
- }
- }
- };
最后我们再来看DisplayPowerController的updatePowerState函数
- // Grab a wake lock if we have unfinished business.
- if (!finished && !mUnfinishedBusiness) {//没有完成
- if (DEBUG) {
- Slog.d(TAG, "Unfinished business...");
- }
- mCallbacks.acquireSuspendBlocker();//持锁,PowerManagerService的回调
- mUnfinishedBusiness = true;
- }
- // Notify the power manager when ready.
- if (ready && mustNotify) {
- // Send state change.
- synchronized (mLock) {
- if (!mPendingRequestChangedLocked) {
- mDisplayReadyLocked = true;
- if (DEBUG) {
- Slog.d(TAG, "Display ready!");
- }
- }
- }
- sendOnStateChangedWithWakelock();
- }
- // Release the wake lock when we have no unfinished business.
- if (finished && mUnfinishedBusiness) {
- if (DEBUG) {
- Slog.d(TAG, "Finished business...");
- }
- mUnfinishedBusiness = false;
- mCallbacks.releaseSuspendBlocker();//完成释放锁
- }
没完成,调用PowerManagerService的回调,下面就是持锁和释放锁,调用的是Displays的锁。
- @Override
- public void acquireSuspendBlocker() {
- mDisplaySuspendBlocker.acquire();
- }
- @Override
- public void releaseSuspendBlocker() {
- mDisplaySuspendBlocker.release();
- }
最后完成了释放锁,mDisplayReadyLocked = true,调用了sendOnStateChangedWithWakelock函数
- private void sendOnStateChangedWithWakelock() {
- mCallbacks.acquireSuspendBlocker();
- mHandler.post(mOnStateChangedRunnable);
- }
- private final Runnable mOnStateChangedRunnable = new Runnable() {
- @Override
- public void run() {
- mCallbacks.onStateChanged();
- mCallbacks.releaseSuspendBlocker();
- }
- };
五、PowerManagerService第二次调用requestPowerState
我们再来看看onStateChanged,就是调用PowerManagerService的updatePowerStateLocked函数,最终会再次调用DisplayPowerController的requestPowerState函数
- public void onStateChanged() {
- synchronized (mLock) {
- mDirty |= DIRTY_ACTUAL_DISPLAY_POWER_STATE_UPDATED;
- updatePowerStateLocked();
- }
- }
在updatePowerStateLocked中第二次调用updateDisplayPowerStateLocked。于是又来到了DisplayPowerController的requestPowerState函数,现在是第二次调用过来了。
- public boolean requestPowerState(DisplayPowerRequest request,
- boolean waitForNegativeProximity) {
- synchronized (mLock) {
- boolean changed = false;
- if (waitForNegativeProximity
- && !mPendingWaitForNegativeProximityLocked) {
- mPendingWaitForNegativeProximityLocked = true;
- changed = true;
- }
- if (mPendingRequestLocked == null) {
- mPendingRequestLocked = new DisplayPowerRequest(request);
- changed = true;
- } else if (!mPendingRequestLocked.equals(request)) {
- mPendingRequestLocked.copyFrom(request);
- changed = true;
- }
- if (changed) {
- mDisplayReadyLocked = false;
- }
- if (changed && !mPendingRequestChangedLocked) {
- mPendingRequestChangedLocked = true;
- sendUpdatePowerStateLocked();
- }
- return mDisplayReadyLocked;//这回直接就返回true了,这个变量是updatePowerState在完成任务后置为true
- }
- }
我们再来看updateDisplayPowerStateLocked调用requestPowerState的返回值。只有这次返回mDisplayReady这个成员变量的才是true
- mDisplayReady = mDisplayManagerInternal.requestPowerState(mDisplayPowerRequest,
- mRequestWaitForNegativeProximity);
六、总结
之前分析过android5.1的这块内容,最大的区别是以前设置背光的那部分是放在了DisplayPowerState中的,而现在又放在了DisplayManagerService中了。