Android PowerManager和Wakelock,帮助我理解

时间:2011-12-31 07:46:00

标签: android wakelock

所以我正在调查PowerManager以防止手机进入睡眠状态。

两个问题:

1)我的手机目前设置为在X秒后关闭显示屏,PowerManager.Wakelock功能是否会覆盖此功能?

2)我的手机有一个顶部按钮,可用于关闭显示屏或关闭手机。 PowerManager.WakeLock是否也会覆盖此功能?

洞察力

2 个答案:

答案 0 :(得分:1)

  1. 我不确定,但我想是的。而且我很难找到这个 来源中的功能。
  2. PowerManager.java中有一个函数goToSleep(time)。这个 函数只调用PowerManagerService goToSleepLo​​cked的方法:

    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();
    }
    }
    
  3. 所以你可以看到所有唤醒锁都被这种方法关闭了。

    方法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(长时间)方法。因此,除非您关闭设备,否则它不会释放部分唤醒锁