0

そのため、電話がスリープ状態にならないように PowerManager を調べています。

2 つの質問:

1) 私の電話は現在、X 秒後にディスプレイをオフにするように設定されています。PowerManager.Wakelock 関数はこれをオーバーライドしますか?

2) 私の電話には、ディスプレイをオフにしたり、電話をオフにしたりするために使用できる上部ボタンがあります。PowerManager.WakeLock もこの機能をオーバーライドしますか?

洞察力に感謝

4

2 に答える 2

1
  1. I'm not sure but I think so. And it's hard to me to find this functionality in the sources.
  2. 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.

于 2011-12-31T09:05:23.897 に答える
1

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(長時間) メソッドを呼び出していません。したがって、デバイスをオフにしない限り、部分的なウェイクロックは解放されません。

于 2012-06-01T08:14:47.370 に答える