Как я могу разрешить Android дремать, пока мое приложение открыто и экран включен? - PullRequest
0 голосов
/ 25 октября 2018

Я создаю приложение, которое будет работать, когда устройство заблокировано, через Activity#setShowWhenLocked(true).Я не хочу запрещать устройству переходить в состояние пониженного энергопотребления.Я знаю, что система делает это с Always-On Display, и дисплей имеет соответствующий режим питания для этого:

/ frameworks / base / core / java / android / view / Display.java

286    /**
287     * Display state: The display is dozing in a low power state; it is still
288     * on but is optimized for showing system-provided content while the
289     * device is non-interactive.
290     *
291     * @see #getState
292     * @see android.os.PowerManager#isInteractive
293     */
294    public static final int STATE_DOZE = ViewProtoEnums.DISPLAY_STATE_DOZE; // 3
295
296    /**
297     * Display state: The display is dozing in a suspended low power state; it is still
298     * on but the CPU is not updating it. This may be used in one of two ways: to show
299     * static system-provided content while the device is non-interactive, or to allow
300     * a "Sidekick" compute resource to update the display. For this reason, the
301     * CPU must not control the display in this mode.
302     *
303     * @see #getState
304     * @see android.os.PowerManager#isInteractive
305     */
306    public static final int STATE_DOZE_SUSPEND = ViewProtoEnums.DISPLAY_STATE_DOZE_SUSPEND; // 4

Этот раздел также есть в / frameworks / base / core / java / android / os / PowerManagerInternal.java :

51     * Wakefulness: The device is dozing.  It is almost asleep but is allowing a special
52     * low-power "doze" dream to run which keeps the display on but lets the application
53     * processor be suspended.  It can be awoken by a call to wakeUp() which ends the dream.
54     * The device fully goes to sleep if the dream cannot be started or ends on its own.
55     */
56    public static final int WAKEFULNESS_DOZING = 3;

Если возможноЯ бы хотел избегать использования root для этого, но если все остальное не удалось, я мог бы вручную управлять дозой с помощью root с помощью этих команд , но это звучит грязно, и я не хочуиспортить дремлющие взаимодействия с любым другим приложением.

Кроме того, меня особенно беспокоит Android Pie (9.0)

Обновление:

Iтакже пытался получить DOZE_WAKE_LOCK, но для этого требуется разрешение системы DEVICE_POWER.Я попытался adb shell pm grant разрешить доступ к своему приложению, но это не изменяемый тип разрешения.

Ответы [ 3 ]

0 голосов
/ 31 октября 2018

Вы можете сделать это с помощью DreamService , который является хранителем экрана.Вы не можете сделать это по Деятельности.Действия не позволяют устройству переходить в спящий режим.

Сны - это интерактивные заставки, которые запускаются, когда зарядное устройство находится в режиме ожидания, или закреплены в настольной док-станции.Dreams - это еще один способ, позволяющий приложениям самовыражаться, адаптированный для выставки и отдыха.

0 голосов
/ 29 ноября 2018

То, что вы хотите, это режим окружающей среды при износе андроида, который позволяет активности отображаться в виде прорисовки (обычно это белые линии с черным фоном), когда устройство спит.Насколько я знаю, код для телефонного устройства не имеет этой функции, потому что ваша деятельность должна расширять класс WearableActivity и управляться системным приложением Ambient.В этом приложении Ambient используется найденный вами пробужденный замок DOZE_WAKE_LOCK.

0 голосов
/ 28 октября 2018

Если вы не запускаете фоновую задачу или не загружаете что-то, например, если ваше приложение воспроизводит видео, вы можете использовать Держите экран на .Это позволит экрану оставаться включенным и сохранять яркость в течение времени, необходимого для вашего приложения.Вы можете очистить его с флагом или оставить его.Это эквивалент дремоты с включенным экраном, поскольку он позволяет процессору отдыхать и останавливать выполнение фоновых задач.

Он не использует ту же мощность, что и пробужденные блокировки , которые используютпроцессор.

Из документов вы можете использовать флаг FLAG_KEEP_SCREEN_ON в своем коде Java:

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);
  }
}

или использовать атрибут android: keepScreenOn в xml:

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

Это не мешает ограничениям Doze

, которые сводятся к следующему:

  • приостановлен доступ к сети
  • игнорирует блокировки пробуждения.
  • ограничение на сигналы тревоги
  • не выполняет сканирование Wi-Fi
  • нет адаптеров синхронизации
  • нет JobSchedulers
...