所以我正在研究 PowerManager 以防止手机进入睡眠状态。
两个问题:
1) 我的手机当前设置为在 X 秒后关闭显示屏,PowerManager.Wakelock 功能会覆盖这个吗?
2)我的手机有一个顶部按钮,可以用来关闭显示器,或者关闭手机。PowerManager.WakeLock 是否也会覆盖此功能?
洞察力赞赏
PowerManager.java 中有一个函数 goToSleep(time)。该函数只是调用 PowerManagerService 的 goToSleepLocked 方法:
private void goToSleepLocked(long time, int reason) {
if (mLastEventTime <= time) {
mLastEventTime = time;
// cancel all of the wake locks
mWakeLockState = SCREEN_OFF;
int N = mLocks.size();
int numCleared = 0;
boolean proxLock = false;
for (int i=0; i<N; i++) {
WakeLock wl = mLocks.get(i);
if (isScreenLock(wl.flags)) {
if (((wl.flags & LOCK_MASK) == PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK)
&& reason == WindowManagerPolicy.OFF_BECAUSE_OF_PROX_SENSOR) {
proxLock = true;
} else {
mLocks.get(i).activated = false;
numCleared++;
}
}
}
if (!proxLock) {
mProxIgnoredBecauseScreenTurnedOff = true;
if (mDebugProximitySensor) {
Slog.d(TAG, "setting mProxIgnoredBecauseScreenTurnedOff");
}
}
EventLog.writeEvent(EventLogTags.POWER_SLEEP_REQUESTED, numCleared);
mStillNeedSleepNotification = true;
mUserState = SCREEN_OFF;
setPowerState(SCREEN_OFF, false, reason);
cancelTimerLocked();
}
}
所以你可以看到在这个方法中所有的唤醒锁都被关闭了。
goToSleep 方法只能由系统组件调用(受签名权限保护)。而且我认为它是在按下电源按钮时调用的。所以它重写了所有的唤醒锁。
1) 是的,当然!如果屏幕处于开启状态并且您获得了唤醒锁,则即使在屏幕超时后屏幕仍将保持开启状态。如果屏幕关闭并且您想将其打开,那么您必须像这样创建唤醒锁实例并获取。
PowerManager.WakeLock wl = pm.newWakeLock(
PowerManager.SCREEN_DIM_WAKE_LOCK
| PowerManager.ACQUIRE_CAUSES_WAKEUP, TAG);
wl.acquire();
这将强制您的屏幕打开。
2)没有唤醒锁不能覆盖该功能。虽然我不同意 Yury,但顶部按钮只是关闭屏幕,并没有调用 goToSleep(long time) 方法。因此,除非您关闭设备,否则它不会释放部分唤醒锁。