Екран сили увімкнено


Відповіді:


339

ЗАБУДУТЬСЯ НЕ ВИКОРИСТОВУВАТИ ЗАМОК ВАКУ

Це вимагає надання додатку додаткового дозволу, і дуже легко вводити помилки там, де ви випадково залишаєтесь у положенні блокування, і таким чином залишаєте екран увімкненим.

Набагато краще використовувати прапор вікна FLAG_KEEP_SCREEN_ON, який можна включити у вікні вашої діяльності onCreate()так:

@Override
protected void onCreate(Bundle icicle) {
    super.onCreate(icicle);

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

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


5
Це заважає пристрою спати? Якщо так, то спільність WAKE_LOCK вважає мене шокуючою помилкою!
Майкл Креймер

32
Так, він утримує екран і запобігає сну пристрою.
hackbod

1
Так, ви можете видалити прапор за допомогою відповідного вікна API. Вам не потрібно турбуватися про те, щоб викликати щось малювання, рамки це роблять, якщо потрібно.
хакбод

1
@hakbod: це спрацювало б для збереження екрана в живих, але як щодо екрана, який спить, чи він його прокине і збереже живим ????
Кавіта

5
@ KC202 ви можете використовувати WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON, щоб екран відображався під час відображення вашого вікна. Також часто використовується з FLAG_DISMISS_KEYGUARD та / або FLAG_SHOW_WHEN_LOCKED.
hackbod

34

На це питання вже чудовий відповідь від @hackbod!

Я відповідаю на це питання двома додатковими рішеннями!

Існуюче рішення:

@Override
    protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);    
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    }

Додаткові рішення:

ми можемо використовувати keepScreenOn

1. implementation використовуючиsetKeepScreenOn() in java code

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

        // or any View (in case generated programmatically ) 
        View v = getLayoutInflater().inflate(R.layout.driver_home, null);

        v.setKeepScreenOn(true);
        setContentView(v);
       }

Документи http://developer.android.com/reference/android/view/View.html#setKeepScreenOn(boolean)

2. Додавання keepScreenOnдоxml layout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:keepScreenOn="true" >

Документи http://developer.android.com/reference/android/view/View.html#attr_android%3akeepScreenOn

Примітка (деякі корисні бали):

1. Не має значення, що keepScreenOnслід використовувати на Main/Root/Parent View ньому, можна використовувати з будь-яким child viewбуде працювати Так само, як це працює вParent view

2. Справа лише в тому, що в View's Visibility must be visibleінших розумних це не вийде!


Примітка, v.setKeepScreenOn(true);здається, є єдиним способом зробити це для діалогового фрагмента на повноекранному екрані
Тіма

16

Ще одне рішення - додати android:keepScreenOn="true"( документацію ) до представлень, які потребують утримання екрана.

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

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