Як запобігти програмуванню пристрою Android спати?


155

Як запобігти програмуванню пристрою Android спати?

Відповіді:


133

Один з варіантів - використовувати фіксатор . Приклад із документів:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
wl.acquire();

// screen and CPU will stay awake during this section

wl.release();

На цій сторінці також є таблиця, яка описує різні типи годин.

Майте на увазі, що потрібно користуватися певною обережністю при використанні блокувальників. Переконайтесь, що ви завжди release()блокуєте, коли закінчите з ним (чи не на передньому плані). Інакше ваш додаток може призвести до серйозного розряду акумулятора та використання процесора.

Документація також містить корисну сторінку, яка описує різні підходи до збереження спокою пристрою та коли ви можете вибрати такий. Якщо "запобігання пристрою спати" посилається лише на екран (а не підтримує центральний процесор активним), то, можливо, блокування пробудження, мабуть, більше, ніж потрібно.

Ви також повинні бути впевнені, що у вашому маніфесті встановлено дозвіл WAKE_LOCK , щоб використовувати цей метод.


21
Більше не слід використовувати це, оскільки цей метод зараз застарілий. Погляньте на одну з інших відповідей.
DuKes0mE

4
Існує ще кілька причин використання годинників, наприклад, якщо пристрій призначений для певного додатка і його потрібно запускати навіть при мінімізації.
Муз

2
PowerManager.PARTIAL_WAKE_LOCK не застаріло, і я думаю, що це найефективніший метод. Це дозволяє користувачеві натиснути кнопку живлення, але процесор все одно буде увімкнено до виходу користувача ();
Мансур Фахад

В офіційній документації йдеться про те, що "Якщо вам потрібно продовжувати працювати центральний процесор, щоб виконати певну роботу перед тим, як пристрій увімкнеться, ви можете використовувати функцію системного обслуговування PowerManager під назвою" блокування блоків ".
Хоакін Юрчук

Це чудовий спосіб, але він застарілий. будь ласка , перевірте цю відповідь: stackoverflow.com/a/22447615/5327912
Parth Anjaria

240

Якщо ви просто хочете заборонити сплячий режим у певному режимі View, просто зателефонуйте setKeepScreenOn(true)до цього Viewабо встановіть keepScreenOnвластивість true. Це не дозволить екрану не вимикатися, поки він Viewзнаходиться на екрані. Для цього не потрібно спеціального дозволу.


18
Крім того, це не змусить телефон залишатися неспаним поза тривалістю життя програми. Ви можете зіткнутися з цією проблемою за допомогою WakeLock.
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

2
Так, у більшості випадків це кращий підхід.
Едвард Фолк

8
Це має бути обрана відповідь. Простий, чистий і як призначено Android. Дякую.
Lior Iluz

2
"Використання Android: KeepScreenOn =" true "еквівалентно використанню FLAG_KEEP_SCREEN_ON. Ви можете використовувати будь-який підхід, який найкраще підходить для вашої програми. Перевага налаштування прапора програмно у вашій діяльності полягає в тому, що він надає можливість програмного очищення прапора пізніше і тим самим дозволяючи екрану вимкнути "- developer.android.com/training/scheduling/wakelock.html
Antonino

Зауважте, що setKeepScreenOn(true)воля набуває чинності лише тоді, коли вона Viewбуде видимою.
Джефф Т.

121

Я знайшов ще одне робоче рішення: додайте наступний рядок у свій додаток під подією onCreate.

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

Мій зразок проекту Кордова виглядає так:

package com.apps.demo;
import android.os.Bundle;
import android.view.WindowManager;
import org.apache.cordova.*;

public class ScanManActivity extends DroidGap {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        super.loadUrl("http://stackoverflow.com");
    }
}

Після цього мій додаток не буде спати, поки він відкритий. Дякуємо за відповідь на xSus.


це було найкращим варіантом на мою думку ... +1
Аміт

Це робиться так само, як і відповідь Witek, різниця лише в тому, що ви помістите це у файл ".java" замість ".xml" ;-)
tiktak

Як щодо дозволу? Чи потрібен дозвіл?
Мехді Хадмелу

@Mehdi Khademloo йому не потрібен дозвіл.
Wessam El Mahdy


17

Встановіть прапори у вікні діяльності, як показано нижче

@Override public void onResume() {
 super.onResume();
 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}

@Override public void onPause() {
 super.onPause();
 getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}

6

З кореневої оболонки (наприклад, оболонки adb) ви можете заблокувати за допомогою:

echo mylockname >/sys/power/wake_lock    

Після цього пристрій залишиться неспаним, поки ви не зробите:

echo mylockname >/sys/power/wake_unlock    

З тим самим рядком для "mylockname".

Зауважте, що це не заважатиме екрану чорніти, але заважатиме процесору спати.

Зауважте, що / sys / power / wake_lock - це читання-запис для користувацького радіо (1001) та групової системи (1000), і, звичайно, root.

Посилання тут: http://lwn.net/Articles/479841/


3

те, що сказав @eldarerathis, є правильним у всіх аспектах, блокування невідомого сигналу - це правильний спосіб утримання пристрою від сну.

Я не знаю, що вам потрібно робити, але дуже важливо подумати про те, як архітектувати ваше додаток, щоб ви не змушували телефон не залишатись спокійним за те, що вам потрібно, або час життя батареї сильно постраждає.

Я хотів би вказати на цей дійсно хороший приклад того, як користуватися AlarmManagerпожежними подіями та пробуджувати телефон та (ваш додаток) виконувати те, що вам потрібно зробити, а потім знову спати: Менеджер сигналізації (джерело: commonsware.com)


Існують додаткові програми, спеціально і цілеспрямовано призначені для розрядки акумулятора. У мене була потреба один раз. В основному він набуде годинників, вібрує, як божевільний, увімкне ліхтарик, збільшить яскравість тощо. Так, так, є програми, які використовують це. Але це було поза темою, тож пробачте мене
TheRealChx101

0

Якщо ви користувач Xamarin, це рішення:

   protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle); //always call superclass first

        this.Window.AddFlags(WindowManagerFlags.KeepScreenOn);

        LoadApplication(new App());
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.