Как запретить 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 , чтобы использовать этот метод.

eldarerathis
источник
21
Вы не должны использовать это больше, так как этот метод устарел сейчас. Посмотрите на один из других ответов.
DuKes0mE
4
Есть все еще некоторые причины использовать wakelocks, например, если устройство предназначено для определенного приложения и должно работать, даже когда оно свернуто.
Муз
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. Спасибо.
Лиор Илуз
2
"Использование android: keepScreenOn =" true "эквивалентно использованию FLAG_KEEP_SCREEN_ON. Вы можете использовать любой подход, который лучше всего подходит для вашего приложения. Преимущество установки флага в вашей деятельности состоит в том, что он дает вам возможность программной очистки флага позже и тем самым позволяя отключить экран »- developer.android.com/training/scheduling/wakelock.html
Антонино
Обратите внимание, что setKeepScreenOn(true)эффект вступит в силу только тогда, когда Viewон виден.
Джефф Т.
121

Я нашел другое рабочее решение: добавьте следующую строку в ваше приложение под событием onCreate.

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

Мой пример проекта Cordova выглядит так:

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.

dogatonic
источник
это был лучший вариант на мой взгляд ... +1
Amit
Это так же, как ответ Witek, единственное отличие состоит в том, что вы помещаете это в файл «.java» вместо «.xml» ;-)
tiktak
Как насчет разрешения? Требуется ли разрешение?
Мехди Хадемлу
@ Mehdi Khademloo это не требует разрешения.
Вессам Эль Махди
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для запуска событий и пробуждения телефона и (вашего приложения), чтобы выполнить то, что вам нужно сделать, а затем снова заснуть: Alarm Manager (источник: commonsware.com)

lucabox
источник
Существуют служебные приложения, специально предназначенные для разрядки аккумулятора. Мне нужен был один раз. По сути, он приобретал бы вейк-шоки, вибрировать как сумасшедший, включать фонарик, увеличивать яркость и т. Д. Так что да, есть приложения, которые используют это. Но это было не по теме, так что прости меня
TheRealChx101
0

Если вы являетесь пользователем Xamarin, это решение:

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

        this.Window.AddFlags(WindowManagerFlags.KeepScreenOn);

        LoadApplication(new App());
    }
hogarth45
источник