1、updatePowerStateLocked()
private void updatePowerStateLocked() {
if (!mSystemReady || mDirty == 0) { //power state都会更新到mDirty中;
return;
}
if (!Thread.holdsLock(mLock)) {
Slog.wtf(TAG, "Power manager lock was not held when calling updatePowerStateLocked");
}
// Phase 0: Basic state updates.
updateIsPoweredLocked(mDirty); //更新mIsPowered变量;
updateStayOnLocked(mDirty); //更新mStayOn变量;
// 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 dirtyPhase1 = mDirty;
dirtyPhase2 |= dirtyPhase1;
mDirty = 0;
updateWakeLockSummaryLocked(dirtyPhase1); //更新mWakeLockSummary变量;
updateUserActivitySummaryLocked(now, dirtyPhase1); //更新mUserActivitySummary变量;
if (!updateWakefulnessLocked(dirtyPhase1)) {
break;
}
}
// Phase 2: Update dreams and display power state.
updateDreamLocked(dirtyPhase2);
updateDisplayPowerStateLocked(dirtyPhase2);
// Phase 3: Send notifications, if needed.
if (mDisplayReady) {
sendPendingNotificationsLocked();
}
// Phase 4: Update suspend blocker.
// Because we might release the last suspend blocker here, we need to make sure
// we finished everything else first!
updateSuspendBlockerLocked();
}
mDirty在以下三个逻辑中设置DIRTY_WAKE_LOCKS标志位:
a).acquireWakeLockInternal()
b).releaseWakeLockInternal()
c).handleWakeLockDeath()
该标志位置1时表示mWakeLocks列表有更新,WakeLock.mFlags取值有:PARTIAL_WAKE_LOCK、FULL_WAKE_LOCK、SCREEN_BRIGHT_WAKE_LOCK、SCREEN_DIM_WAKE_LOCK、PROXIMITY_SCREEN_OFF_WAKE_LOCK
mDirty在以下几个逻辑中设置DIRTY_WAKEFULNESS标志位:
a).wakeUpNoUpdateLocked()
b).goToSleepNoUpdateLocked()
c).napNoUpdateLocked()
d).handleSandman()
该标志位置1表示mWakefulness值有更新,mWakefulness取值有:WAKEFULNESS_ASLEEP、WAKEFULNESS_AWAKE、WAKEFULNESS_NAPPING、WAKEFULNESS_DREAMING
上述WakeLock.mFlags和mWakefulness的值会综合起来影响mWakeLockSummary变量值,mWakeLockSummary取值有:WAKE_LOCK_CPU、WAKE_LOCK_SCREEN_BRIGHT、WAKE_LOCK_SCREEN_DIM、WAKE_LOCK_BUTTON_BRIGHT、WAKE_LOCK_PROXIMITY_SCREEN_OFF、WAKE_LOCK_STAY_AWAKE
mWakeLockSummary的使用:
isBeingKeptAwakeLocked()
getDesiredScreenPowerStateLocked()