2011-12-31 1 views
0

, поэтому я ищу PowerManager, чтобы телефон не спал.Android PowerManager и Wakelock, помогите мне понять

Два вопроса:

1) Мой телефон в настоящее время установлен выключить дисплей после Х секунд, будут функции PowerManager.Wakelock переопределить это?

2) Мой телефон имеет верхнюю кнопку, которая может использоваться для выключения дисплея или для выключения телефона. Будет ли PowerManager.WakeLock переопределять эту функциональность?

прозрение оценили

ответ

1
  1. Я не уверен, но я так думаю. И мне трудно найти эту функцию в источниках.
  2. Существует функция в PowerManager.java goToSleep (время). Эта функция просто вызывает метод 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(); 
    } 
    } 
    

Таким образом, вы можете видеть, что все wakelocks являются shutdowned в этом методе.

Метод goToSleep может быть вызван только системными компонентами (защищенными разрешением подписи). И я думаю, что он называется во время нажатия кнопки питания. Поэтому он переписывает все вакелоки.

1

1) Да, конечно! Если экран включен, и вы приобретаете wakelock, экран будет оставаться включенным даже после таймаута экрана. Если экран выключен, и вы хотите включить его, тогда вам нужно создать экземпляр wakelock, как этот, и приобрести.

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

Это приведет к включению вашего экрана.

2) Никакой wakelock не может переопределить эту функциональность. Хотя я не согласен с Юрием, кнопка «Вверх» просто выключает экран и не вызывает метод goToSleep (long time). Поэтому он не освободит частичный wakelock до тех пор, пока вы не выключите устройство.

 Смежные вопросы

  • Нет связанных вопросов^_^