android手机进入设置,在进入显示,有个休眠时间的选项。可以设置多久不操作后熄灭屏幕。android熄灭屏幕实际根据系统当前wakeLock锁的数量和类型有关,本篇文章不讨论这个问题。只是本人发现了一个奇怪的现象:
1.设置休眠时间为1分钟,在launcher界面不做任何操作,大概一分钟左右灭屏,和设置中时间相同。
2.灭屏后按电源键唤醒屏幕,在锁屏界面不做任何操作,感觉十秒左右屏幕已经熄灭,远远达不到设置中时间。
到底为什么会出现这个现象呢?我们可以猜测肯定系统有判断是否锁屏,然后对自动灭屏时间进行了不同的设置,下面验证我们的猜测。
经过一番研究代码最终发现关于是否灭屏的判断在
private boolean isBeingKeptAwakeLocked() {
return mStayOn
|| mProximityPositive
|| (mWakeLockSummary & WAKE_LOCK_STAY_AWAKE) != 0
|| (mUserActivitySummary & (USER_ACTIVITY_SCREEN_BRIGHT
| USER_ACTIVITY_SCREEN_DIM)) != 0
|| mScreenBrightnessBoostInProgress;
}
如果该方法返回false就会灭屏,意味着其中每一项都要为false,其中和这个现象相关的为
(mUserActivitySummary & (USER_ACTIVITY_SCREEN_BRIGHT | USER_ACTIVITY_SCREEN_DIM)) != 0
USER_ACTIVITY_SCREEN_BRIGHT指的是屏幕亮,指的是USER_ACTIVITY_SCREEN_DIM屏幕暗,也就意味着,mUserActivitySummary的标志位不能有亮和暗这两个属性。mUserActivitySummary主要在updateUserActivitySummaryLocked这个方法中更新。所以主要的逻辑在该方法中。
private void updateUserActivitySummaryLocked(long now, int dirty) {
// Update the status of the user activity timeout timer.
if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_USER_ACTIVITY
| DIRTY_WAKEFULNESS | DIRTY_SETTINGS)) != 0) {
mHandler.removeMessages(MSG_USER_ACTIVITY_TIMEOUT);
long nextTimeout = 0;
if (mWakefulness == WAKEFULNESS_AWAKE
|| mWakefulness == WAKEFULNESS_DREAMING
|| mWakefulness == WAKEFULNESS_DOZING) {
final int sleepTimeout = getSleepTimeoutLocked();