Как заставить работать Android WakeLock? - PullRequest
45 голосов
/ 11 января 2010

Мой WakeLock не держит мое устройство в активном состоянии.

В OnCreate() У меня есть:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, "My Tag");
mWakeLock.acquire();

тогда:

new CountDownTimer(1320000, 200) {

    public void onTick(long millisUntilFinished) {
        // I update a progress bar here.                                         
    }

    public void onFinish() {
        // I finish updating the progress bar.
        mWakeLock.release();
    }
}.start();

Экран выключается до окончания таймера, как я могу сделать экран видимым?

mWakeLock - это поле, ранее объявленное так:

private PowerManager.WakeLock mWakeLock;

Мое устройство использует Android 1.6. Я был бы очень признателен за любую помощь, чтобы решить эту проблему.

Ответы [ 13 ]

106 голосов
/ 05 апреля 2011

WakeLock обычно не вызывает проблем с перезагрузкой. В вашем коде могут быть другие проблемы. WakeLock сильно разряжает батарею, если ее не использовать после использования.

WakeLock - неэффективный способ держать экран включенным. Вместо этого используйте WindowManager, чтобы творить чудеса. Следующей одной строки будет достаточно для WakeLock. Для этого также необходимо разрешение WakeLock. Также этот код более эффективен, чем wakeLock.

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

Вам не нужно переводить WakeLock вручную. Этот код позволит системе Android автоматически обрабатывать блокировку. Когда ваше приложение находится на переднем плане, WakeLock удерживается, а система Android автоматически снимает блокировку.

Попробуйте и оставьте свой комментарий ...

50 голосов
/ 11 января 2010

У вас есть необходимое разрешение , указанное в вашем манифесте?

<uses-permission android:name="android.permission.WAKE_LOCK" />
23 голосов
/ 29 сентября 2011

Вы просто должны написать это:

 private PowerManager.WakeLock wl;

    protected void onCreate(Bundle savedInstanceState) {
               super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
            wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "DoNjfdhotDimScreen");
    }//End of onCreate

            @Override
        protected void onPause() {
            super.onPause();
            wl.release();
        }//End of onPause

        @Override
        protected void onResume() {
            super.onResume();
            wl.acquire();
        }//End of onResume

, а затем добавить разрешение в файле манифеста

 <uses-permission android:name="android.permission.WAKE_LOCK" />

Теперь ваша активность всегда будет бодрствующей. Вы можете делать другие вещи, как w1.release() согласно вашему требованию.

7 голосов
/ 07 мая 2015

Добавить разрешение в AndroidManifest.xml, как указано ниже

<uses-permission android:name="android.permission.WAKE_LOCK" />

желательно ДО ваших тегов объявления <application>, но ПОСЛЕ тегов <manifest>, затем попробуйте сделать так, чтобы ваш метод onCreate() содержал только экземпляр WakeLock.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
    mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, "My Tag");
}

и затем в вашем onResume() методе

@Override
public void onResume() {
   mWakeLock.aquire();
}

и на вашем onFinish() методе место

@Override
public void onFinish() {
   mWakeLock.release();
}
6 голосов
/ 09 июня 2014

Для достижения той же программы вы можете использовать следующее

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

или добавление следующего в макет также выполнит вышеуказанную задачу

 android:keepScreenOn="true"

Подробности вы можете получить по следующему URL http://developer.android.com/training/scheduling/wakelock.html

Я использовал комбинацию следования, чтобы разбудить экран, когда клавиатура заблокирована, и оставить экран включенным

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
4 голосов
/ 08 июня 2017

Держите экран включенным

Первый способ:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

Второй способ:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:keepScreenOn="true">
    ...
</RelativeLayout>

Оставить процессор включенным:

<uses-permission android:name="android.permission.WAKE_LOCK" />

и

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag");
wakeLock.acquire();

Чтобы снять блокировку после пробуждения, позвоните wakelock.release(). Это освобождает ваши претензии к процессору. Важно, чтобы блокировка активировалась, как только приложение завершит ее использование, чтобы избежать разрядки аккумулятора.

Документы здесь .

2 голосов
/ 15 июня 2016
{PowerManager mgr = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
WakeLock wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"MyWakeLock"); 
wakeLock.acquire();}

используйте этот код и не забудьте разрешить wakelock в манифесте Android

2 голосов
/ 23 декабря 2013

пример кода с сайта разработчиков Android

public class MainActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  }

Лучшие практики для фоновых заданий

2 голосов
/ 13 августа 2013

Спасибо за эту тему. Мне было трудно внедрить таймер в моем коде на 5 минут для запуска действия, потому что мой телефон отключил / уснул около 2 минут. С вышеупомянутой информацией кажется, что я смог обойти работу.

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    /* Time Lockout after 5 mins */
    getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);

    Timer timer = new Timer();
    timer.schedule(new TimerTask() {

       public void run() {

        Intent i = new Intent(AccountsList.this, AppEntryActivity.class);
        i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(i);
        finish();
        return;

       }

    }, 300000); 
    /* Time Lockout END */
 }
2 голосов
/ 31 января 2010

У меня похожая проблема. Я могу заставить экран оставаться включенным, но если я использую частичную блокировку после пробуждения и экран выключен, моя функция onFinish не вызывается, пока экран не будет включен.

Вы можете проверить свою блокировку от пробуждения с помощью mWakeLock.isHeld (), прежде всего, чтобы убедиться, что вы ее получаете. Самый простой способ - добавить это в код, установить для него точку останова в отладчике и затем проверить его.

В моем случае я получаю это, но частичная блокировка следа, похоже, ничего не делает. Вот мой рабочий код для затемнения экрана.

protected void setScreenLock(boolean on){
        if(mWakeLock == null){
            PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
            mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK |
                                        PowerManager.ON_AFTER_RELEASE, TAG);
        }
        if(on){
         mWakeLock.acquire();
        }else{
            if(mWakeLock.isHeld()){
                mWakeLock.release();
            }
         mWakeLock = null;
        }

    }

ДОПОЛНЕНИЕ:

Пользователи Droid Eris и DROID сообщают мне, что это НЕ работает на их устройствах, хотя на моем G1 работает нормально. На каком устройстве вы тестируете? Я думаю, что это может быть ошибка Android.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...