0

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

两个问题:

1) 我的手机当前设置为在 X 秒后关闭显示屏,PowerManager.Wakelock 功能会覆盖这个吗?

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

洞察力赞赏

4

2 回答 2

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();
    }
    }
    

所以你可以看到在这个方法中所有的唤醒锁都被关闭了。

goToSleep 方法只能由系统组件调用(受签名权限保护)。而且我认为它是在按下电源按钮时调用的。所以它重写了所有的唤醒锁。

于 2011-12-31T09:05:23.897 回答
1

1) 是的,当然!如果屏幕处于开启状态并且您获得了唤醒锁,则即使在屏幕超时后屏幕仍将保持开启状态。如果屏幕关闭并且您想将其打开,那么您必须像这样创建唤醒锁实例并获取。

   PowerManager.WakeLock wl = pm.newWakeLock(
   PowerManager.SCREEN_DIM_WAKE_LOCK
  | PowerManager.ACQUIRE_CAUSES_WAKEUP, TAG);
  wl.acquire();

这将强制您的屏幕打开。

2)没有唤醒锁不能覆盖该功能。虽然我不同意 Yury,但顶部按钮只是关闭屏幕,并没有调用 goToSleep(long time) 方法。因此,除非您关闭设备,否则它不会释放部分唤醒锁。

于 2012-06-01T08:14:47.370 回答