そのため、電話がスリープ状態にならないように PowerManager を調べています。
2 つの質問:
1) 私の電話は現在、X 秒後にディスプレイをオフにするように設定されています。PowerManager.Wakelock 関数はこれをオーバーライドしますか?
2) 私の電話には、ディスプレイをオフにしたり、電話をオフにしたりするために使用できる上部ボタンがあります。PowerManager.WakeLock もこの機能をオーバーライドしますか?
洞察力に感謝
There is a function in PowerManager.java goToSleep(time). This function simply calls method of 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();
}
}
So you can see that all wakelocks are shutdowned in this method.
The method goToSleep can be called only by system components (protected with signature permission). And I think that it is called during the press of your power button. So it rewrites all the wakelocks.
1) はい、もちろんです!画面がONの状態でウェイクロックを取得すると、画面タイムアウト後も画面がONのままになります。画面が OFF で ON にしたい場合は、このように wakelock インスタンスを作成して取得する必要があります。
PowerManager.WakeLock wl = pm.newWakeLock(
PowerManager.SCREEN_DIM_WAKE_LOCK
| PowerManager.ACQUIRE_CAUSES_WAKEUP, TAG);
wl.acquire();
これにより、画面が強制的にオンになります。
2) ウェイクロックはその機能をオーバーライドできません。私は Yury に同意しませんが、トップ ボタンは画面をオフに切り替えるだけであり、goToSleep(長時間) メソッドを呼び出していません。したがって、デバイスをオフにしない限り、部分的なウェイクロックは解放されません。