android5.1 PowerManagerService和DisplayPowerControler、DisplayPowerState关系.doc_第1页
android5.1 PowerManagerService和DisplayPowerControler、DisplayPowerState关系.doc_第2页
android5.1 PowerManagerService和DisplayPowerControler、DisplayPowerState关系.doc_第3页
android5.1 PowerManagerService和DisplayPowerControler、DisplayPowerState关系.doc_第4页
android5.1 PowerManagerService和DisplayPowerControler、DisplayPowerState关系.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

android5.1 PowerManagerService和DisplayPowerControler、DisplayPowerState关系PowerManagerService在updateDisplayPowerStateLocked中与DisplayPowerControler交互,详细看代码:java view plain copyprivate 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(); / Determine appropriate screen brightness and auto-brightness adjustments. int screenBrightness = mScreenBrightnessSettingDefault; float screenAutoBrightnessAdjustment = 0.0f; boolean autoBrightness = (mScreenBrightnessModeSetting = Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC); if (isValidBrightness(mScreenBrightnessOverrideFromWindowManager) screenBrightness = mScreenBrightnessOverrideFromWindowManager; autoBrightness = 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.useAutoBrightness = autoBrightness; mDisplayPowerRequest.useProximitySensor = shouldUseProximitySensorLocked(); mDisplayPowerRequest.lowPowerMode = mLowPowerModeEnabled; mDisplayPowerRequest.boostScreenBrightness = mScreenBrightnessBoostInProgress; if (mDisplayPowerRequest.policy = DisplayPowerRequest.POLICY_DOZE) mDisplayPowerRequest.dozeScreenState = mDozeScreenStateOverrideFromDreamManager; mDisplayPowerRequest.dozeScreenBrightness = mDozeScreenBrightnessOverrideFromDreamManager; else mDisplayPowerRequest.dozeScreenState = Display.STATE_UNKNOWN; mDisplayPowerRequest.dozeScreenBrightness = PowerManager.BRIGHTNESS_DEFAULT; mDisplayReady = mDisplayManagerInternal.requestPowerState(mDisplayPowerRequest,/调用DisplayPowerControler的requestPowerstate接口 mRequestWaitForNegativeProximity); mRequestWaitForNegativeProximity = false; return mDisplayReady & !oldDisplayReady; 接下来我们再看看mDisplayManagerInternal这个成员变量:在systemready中java view plain copymDisplayManagerInternal = getLocalService(DisplayManagerInternal.class); 。 mDisplayManagerInternal.initPowerManagement( mDisplayPowerCallbacks, mHandler, sensorManager); 而DisplayPowerControler是在DisplayManagerService中定义,并且放在localservice中,publish出来。java view plain copy 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) / The order of operations is important for legacy reasons. if (state = Display.STATE_OFF) requestGlobalDisplayStateInternal(state); callbacks.onDisplayStateChange(state);/注意这个接口后续会介绍 if (state != Display.STATE_OFF) requestGlobalDisplayStateInternal(state); ; mDisplayPowerController = new DisplayPowerController(/new一个DisplayPowerController mContext, callbacks, handler, sensorManager, blanker); Override public boolean requestPowerState(DisplayPowerRequest request, boolean waitForNegativeProximity) return mDisplayPowerController.requestPowerState(request, waitForNegativeProximity); 。 好接下来我们先分析DisplayPowerControler中的requestPowerState函数:java view plain copypublic 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;/注意有变化,返回的是false if (changed & !mPendingRequestChangedLocked) mPendingRequestChangedLocked = true; sendUpdatePowerStateLocked();/发送信号,到updatePowerState return mDisplayReadyLocked; 下面我们就来分析下DisplayPowerControler中的updatePowerState函数:java view plain copyprivate void updatePowerState() / Update the power state request. final boolean mustNotify; boolean mustInitialize = false; boolean autoBrightnessAdjustmentChanged = false; synchronized (mLock) mPendingUpdatePowerStateLocked = false; if (mPendingRequestLocked = 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;/这时候mDisplayReadyLocked还是false,这是requestPowerState的返回值 mustNotify = !mDisplayReadyLocked; / Initialize things the first time the power state is changed. if (mustInitialize) initialize(); / Compute the basic display state using the policy. / We might override this below based on other factors. int state; int brightness = PowerManager.BRIGHTNESS_DEFAULT; boolean performScreenOffTransition = false; switch (mPowerRequest.policy) /根据policy,得到显示的state 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); / Apply the proximity sensor.这块是距离传感器 if (mProximitySensor != null) if (mPowerRequest.useProximitySensor & state != Display.STATE_OFF) setProximitySensorEnabled(true); if (!mScreenOffBecauseOfProximity & mProximity = PROXIMITY_POSITIVE) mScreenOffBecauseOfProximity = true; sendOnProximityPositiveWithWakelock(); else if (mWaitingForNegativeProximity & mScreenOffBecauseOfProximity & mProximity = PROXIMITY_POSITIVE & state != Display.STATE_OFF) setProximitySensorEnabled(true); else setProximitySensorEnabled(false); mWaitingForNegativeProximity = false; if (mScreenOffBecauseOfProximity & mProximity != PROXIMITY_POSITIVE) mScreenOffBecauseOfProximity = false; sendOnProximityNegativeWithWakelock(); else mWaitingForNegativeProximity = false; if (mScreenOffBecauseOfProximity) state = Display.STATE_OFF; / Animate the screen state change unless already animating. / The transition may be deferred, so after this point we will use the / actual state instead of the desired one. /后面详细分析下这函数,主要设置显示的state,和displayPowerState交互。 animateScreenStateChange(state, performScreenOffTransition); state = mPowerState.getScreenState(); / Use zero brightness when screen is off. if (state = Display.STATE_OFF) brightness = PowerManager.BRIGHTNESS_OFF; / Configure auto-brightness. boolean autoBrightnessEnabled = false; if (mAutomaticBrightnessController != null) final boolean autoBrightnessEnabledInDoze = mAllowAutoBrightnessWhileDozingConfig & (state = Display.STATE_DOZE | state = Display.STATE_DOZE_SUSPEND); autoBrightnessEnabled = mPowerRequest.useAutoBrightness & (state = Display.STATE_ON | autoBrightnessEnabledInDoze) & brightness 0; mAutomaticBrightnessController.configure(autoBrightnessEnabled, mPowerRequest.screenAutoBrightnessAdjustment, state != Display.STATE_ON); / Apply brightness boost. / We do this here after configuring auto-brightness so that we dont / disable the light sensor during this temporary state. That way when / boost ends we will be able to resume normal auto-brightness behavior / without any delay. if (mPowerRequest.boostScreenBrightness & brightness != PowerManager.BRIGHTNESS_OFF) brightness = PowerManager.BRIGHTNESS_ON; / Apply auto-brightness. boolean slowChange = false; if (brightness = 0) / Use current auto-brightness value and slowly adjust to changes. brightness = clampScreenBrightness(brightness); if (mAppliedAutoBrightness & !autoBrightnessAdjustmentChanged) slowChange = true; / slowly adapt to auto-brightness mAppliedAutoBrightness = true; else mAppliedAutoBrightness = false; else mAppliedAutoBrightness = false; / Use default brightness when dozing unless overridden. if (brightness 0 & (state = Display.STATE_DOZE | state = Display.STATE_DOZE_SUSPEND) brightness = mScreenBrightnessDozeConfig; / Apply manual brightness. / Use the current brightness setting from the request, which is expected / provide a nominal default value for the case where auto-brightness / is not ready yet. if (brightness mScreenBrightnessRangeMinimum) brightness = Math.max(Math.min(brightness - SCREEN_DIM_MINIMUM_REDUCTION, mScreenBrightnessDimConfig), mScreenBrightnessRangeMinimum); if (!mAppliedDimming) slowChange = false; mAppliedDimming = true; / If low power mode is enabled, cut the brightness level by half / as long as it is above the minimum threshold. if (mPowerRequest.lowPowerMode) /低功耗模式 if (brightness mScreenBrightnessRangeMinimum) brightness = Math.max(brightness / 2, mScreenBrightnessRangeMinimum); if (!mAppliedLowPower) slowChange = false; mAppliedLowPower = true; / Animate the screen brightness when the screen is on or dozing. / Skip the animation when the screen is off or suspended. 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); / Determine whether the display is ready for use in the newly requested state. / Note that we do not wait for the brightness ramp animation to complete before / reporting the display is ready because we only need to ensure the screen is in the / right power state even as it continues to converge on the desired brightness. final boolean ready = mPendingScreenOnUnblocker = null & !mColorFadeOnAnimator.isStarted() & !mColorFadeOffAnimator.isStarted() & mPowerState.waitUntilClean(mCleanListener); final boolean finished = ready & !mScreenBrightnessRampAnimator.isAnimating(); / Grab a wake lock if we have unfinished business. if (!finished & !mUnfinishedBusiness) if (DEBUG) Slog.d(TAG, Unfinished business.); mCallbacks.acquireSuspendBlocker();/回调持cpu锁 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();/重新在PowerManagerService中调用updatePowerState函数 / Release the wake lock when we have no unfinished business. if (finished & mUnfinishedBusiness) if (DEBUG) Slog.d(TAG, Finished business.); mUnfinishedBusiness = false; mCallbacks.releaseSuspendBlocke

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论