所以我正在调查PowerManager以防止手机进入睡眠状态。
两个问题:
1)我的手机目前设置为在X秒后关闭显示屏,PowerManager.Wakelock功能是否会覆盖此功能?
2)我的手机有一个顶部按钮,可用于关闭显示屏或关闭手机。 PowerManager.WakeLock是否也会覆盖此功能?
洞察力
答案 0 :(得分:1)
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 :(得分:1)
1)是的,当然!如果屏幕为ON并且您获得了唤醒锁,则即使在屏幕超时后屏幕仍将保持为ON。如果屏幕关闭并且你想打开它,那么你必须创建像这样的唤醒锁实例并获得。
PowerManager.WakeLock wl = pm.newWakeLock(
PowerManager.SCREEN_DIM_WAKE_LOCK
| PowerManager.ACQUIRE_CAUSES_WAKEUP, TAG);
wl.acquire();
这将强制您的屏幕开启。
2)没有唤醒锁无法覆盖该功能。虽然我不同意Yury,但Top按钮只是关闭屏幕而不是调用goToSleep(长时间)方法。因此,除非您关闭设备,否则它不会释放部分唤醒锁。