1、updateIsPoweredLocked函数,先是要dirty有DIRTY_BATTERY_STATE标志位。我们在下面分析下,什么时候会有这个标志位private void updateIsPoweredLocked(int dirty) if (dirty & DIRTY_BATTERY_STATE) != 0) final boolean wasPowered = mIsPowered; final int oldPlugType = mPlugType; final boolean oldLevelLow = mBatteryLevelLow; mIsPowered = mBatte
2、ryManagerInternal.isPowered(BatteryManager.BATTERY_PLUGGED_ANY);/这些都是从BatteryService获取 mPlugType = mBatteryManagerInternal.getPlugType(); mBatteryLevel = mBatteryManagerInternal.getBatteryLevel(); mBatteryLevelLow = mBatteryManagerInternal.getBatteryLevelLow(); if (DEBUG_SPEW) Slog.d(TAG, updateIsPo
3、weredLocked: wasPowered= + wasPowered + , mIsPowered= + mIsPowered , oldPlugType= + oldPlugType , mPlugType= + mPlugType , mBatteryLevel= + mBatteryLevel); if (wasPowered != mIsPowered | oldPlugType != mPlugType) /是否充电或者充电类型改变了 mDirty |= DIRTY_IS_POWERED;/mDirty置位 / Update wireless dock detection st
4、ate. final boolean dockedOnWirelessCharger = mWirelessChargerDetector.update(/无线充电相关 mIsPowered, mPlugType, mBatteryLevel); / Treat plugging and unplugging the devices as a user activity. / Users find it disconcerting when they plug or unplug the device / and it shuts off right away. / Some devices
5、also wake the device when plugged or unplugged because / they dont have a charging LED. final long now = SystemClock.uptimeMillis(); if (shouldWakeUpWhenPluggedOrUnpluggedLocked(wasPowered, oldPlugType, dockedOnWirelessCharger) /是否需要唤醒设备 wakeUpNoUpdateLocked(now, Process.SYSTEM_UID); userActivityNoU
6、pdateLocked(/触发userActivity now, PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, Process.SYSTEM_UID); / Tell the notifier whether wireless charging has started so that / it can provide feedback to the user. if (dockedOnWirelessCharger) /无线充电相关 mNotifier.onWirelessChargingStarted();= mIsPowered | oldLevel
7、Low != mBatteryLevelLow) if (oldLevelLow != mBatteryLevelLow & !mBatteryLevelLow) resetting low power snooze mAutoLowPowerModeSnoozing = false; updateLowPowerModeLocked();/更新低功耗模式 首先systemReady函数最终会把mDirty置位为DIRTY_BATTERY_STATE,还有收BatterySevice发出来的广播,最总也会置这个标志位。private final class BatteryReceiver ex
8、tends BroadcastReceiver Override public void onReceive(Context context, Intent intent) synchronized (mLock) handleBatteryStateChangedLocked();private void handleBatteryStateChangedLocked() mDirty |= DIRTY_BATTERY_STATE; updatePowerStateLocked();再来看看电池状态发生什么变化要唤醒设备:private boolean shouldWakeUpWhenPlu
9、ggedOrUnpluggedLocked( boolean wasPowered, int oldPlugType, boolean dockedOnWirelessCharger) / Dont wake when powered unless configured to do so. mWakeUpWhenPluggedOrUnpluggedConfig) /如果资源中没有配置这项,直接退出不唤醒设备 return false;t wake when undocked from wireless charger. / See WirelessChargerDetector for jus
10、tification. if (wasPowered &mIsPowered & oldPlugType = BatteryManager.BATTERY_PLUGGED_WIRELESS) /这是一个 拔出的工作,然后之前的无线充电 t wake when docked on wireless charger unless we are certain of it. wasPowered & mIsPowered mPlugType = BatteryManager.BATTERY_PLUGGED_WIRELESS/插入动作,现在是无线充电 dockedOnWirelessCharger)
11、/ If already dreaming and becoming powered, then dont wake. if (mIsPowered & mWakefulness = WAKEFULNESS_DREAMING) /正在充电,但是mWakefulness 是做梦状态 t wake while theater mode is enabled. if (mTheaterModeEnabled &mWakeUpWhenPluggedOrUnpluggedInTheaterModeConfig) / Otherwise wake up! return true;/其他就唤醒设备 继续分析
12、updatePowerStateLocked函数,分析updateStayOnLocked函数。一般这个函数mStatyon为fasle,除非在资源中设置哪种充电状态下可以长亮。private void updateStayOnLocked(int dirty) (DIRTY_BATTERY_STATE | DIRTY_SETTINGS) != 0) /当dirty是电池状态和设置的状态改变时 final boolean wasStayOn = mStayOn; if (mStayOnWhilePluggedInSetting != 0/这个值从资源中读取,一般设置的话代表哪种充电时可以常亮
13、isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked() /看有没有设mMaximumScreenOffTimeoutFromDeviceAdmin屏幕最大亮屏时间,没设默认最大。那么这个函数返回是false mStayOn = mBatteryManagerInternal.isPowered(mStayOnWhilePluggedInSetting); else mStayOn = false; if (mStayOn != wasStayOn) mDirty |= DIRTY_STAY_ON;继续分析updatePowerState
14、Locked函数的updateScreenBrightnessBoostLocked函数,这个函数是更新屏幕是否保持最亮状态private void updateScreenBrightnessBoostLocked(int dirty) DIRTY_SCREEN_BRIGHTNESS_BOOST) != 0) /这个状态实在boostScreenBrightnessInternal函数中设置最亮时置位,当然下面发送消息MSG_SCREEN_BRIGHTNESS_BOOST_TIMEOUT也会将这个标志位置位 if (mScreenBrightnessBoostInProgress) /当前正
15、在最亮屏幕这个状态 mHandler.removeMessages(MSG_SCREEN_BRIGHTNESS_BOOST_TIMEOUT); if (mLastScreenBrightnessBoostTime mLastSleepTime) final long boostTimeout = mLastScreenBrightnessBoostTime + SCREEN_BRIGHTNESS_BOOST_TIMEOUT; if (boostTimeout now) /看当前时间是否小于最亮屏幕结束的时间 Message msg = mHandler.obtainMessage(MSG_SC
16、REEN_BRIGHTNESS_BOOST_TIMEOUT); msg.setAsynchronous(true); mHandler.sendMessageAtTime(msg, boostTimeout);/发送一个延迟的消息,到最亮屏幕结束的时候接受到消息,将标志位置为DIRTY_SCREEN_BRIGHTNESS_BOOST后,重新再回到这个函数 mScreenBrightnessBoostInProgress = false;/回到这个函数时,直接将这个屏幕最亮状态的标志位改成false userActivityNoUpdateLocked(now,/触发一个userActivity
17、 PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, Process.SYSTEM_UID);下面看看MSG_SCREEN_BRIGHTNESS_BOOST_TIMEOUT消息的处理函数。case MSG_SCREEN_BRIGHTNESS_BOOST_TIMEOUT: handleScreenBrightnessBoostTimeout(); break;private void handleScreenBrightnessBoostTimeout() / runs on handler thread handleScreenBrightnessBoostT
18、imeout mDirty |= DIRTY_SCREEN_BRIGHTNESS_BOOST;接下来看updatePowerStateLocked函数的另一个阶段:/ Phase 1: Update wakefulness. / Loop because the wake lock and user activity computations are influenced / by changes in wakefulness. final long now = SystemClock.uptimeMillis();int dirtyPhase2 = 0;for (;) int dirtyPh
19、ase1 = mDirty;/这个循环中每次新的mDirty全部给dirtyPhase1,并且在这个循环中使用这个dirty dirtyPhase2 |= dirtyPhase1;/dirtyPhase2 会把之前所有的mDirty状态全部或上,然后用这个状态继续下面的函数 mDirty = 0;/mDirty会在这里清零 updateWakeLockSummaryLocked(dirtyPhase1); updateUserActivitySummaryLocked(now, dirtyPhase1);updateWakefulnessLocked(dirtyPhase1) 先看下updat
20、eWakeLockSummaryLocked函数,更新wakelock的函数private void updateWakeLockSummaryLocked(int dirty) (DIRTY_WAKE_LOCKS | DIRTY_WAKEFULNESS) ! mWakeLockSummary = 0; final int numWakeLocks = mWakeLocks.size(); for (int i = 0; i numWakeLocks; i+) final WakeLock wakeLock = mWakeLocks.get(i); switch (wakeLock.mFlag
21、s & PowerManager.WAKE_LOCK_LEVEL_MASK) /先根据wakelock的flag,mWakeLockSummary或上各种状态 case PowerManager.PARTIAL_WAKE_LOCK: mWakeLockSummary |= WAKE_LOCK_CPU; case PowerManager.FULL_WAKE_LOCK: mWakeLockSummary |= WAKE_LOCK_SCREEN_BRIGHT | WAKE_LOCK_BUTTON_BRIGHT; case PowerManager.SCREEN_BRIGHT_WAKE_LOCK:
22、mWakeLockSummary |= WAKE_LOCK_SCREEN_BRIGHT; case PowerManager.SCREEN_DIM_WAKE_LOCK: mWakeLockSummary |= WAKE_LOCK_SCREEN_DIM; case PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK:/距离传感器相关 mWakeLockSummary |= WAKE_LOCK_PROXIMITY_SCREEN_OFF; case PowerManager.DOZE_WAKE_LOCK: mWakeLockSummary |= WAKE_LOCK
23、_DOZE; / Cancel wake locks that make no sense based on the current state. if (mWakefulness != WAKEFULNESS_DOZING) /下面根据各种状态,将上面或上的mWakeLockSummary,有的减去 mWakeLockSummary &= WAKE_LOCK_DOZE; if (mWakefulness = WAKEFULNESS_ASLEEP | (mWakeLockSummary & WAKE_LOCK_DOZE) != (WAKE_LOCK_SCREEN_BRIGHT | WAKE_L
24、OCK_SCREEN_DIM | WAKE_LOCK_BUTTON_BRIGHT); if (mWakefulness = WAKEFULNESS_ASLEEP) = WAKE_LOCK_PROXIMITY_SCREEN_OFF; / Infer implied wake locks where necessary based on the current state. if (mWakeLockSummary & (WAKE_LOCK_SCREEN_BRIGHT | WAKE_LOCK_SCREEN_DIM) != 0) /只要有屏幕锁,cpu锁必须持有 if (mWakefulness =
25、 WAKEFULNESS_AWAKE) mWakeLockSummary |= WAKE_LOCK_CPU | WAKE_LOCK_STAY_AWAKE; else if (mWakefulness = WAKEFULNESS_DREAMING) updateWakeLockSummaryLocked: mWakefulness= + PowerManagerInternal.wakefulnessToString(mWakefulness) , mWakeLockSummary=0x + Integer.toHexString(mWakeLockSummary);下面分析下updateUserActivitySummaryLocked函数private void updateUs
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1