Держите устройство в спящем режиме

Чтобы избежать разрядки аккумулятора, Android-устройство, оставленное бездействующим, быстро засыпает. Однако бывают случаи, когда приложению необходимо «разбудить» экран или процессор и оставить его активным для выполнения некоторой работы.

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

Альтернативы использованию блокировки пробуждения

Прежде чем добавлять поддержку Wakelock в свое приложение, подумайте, поддерживают ли варианты использования вашего приложения одно из следующих альтернативных решений:

  • Если ваше приложение выполняет длительную загрузку HTTP, рассмотрите возможность использования DownloadManager .

  • Если ваше приложение синхронизирует данные с внешнего сервера, рассмотрите возможность создания адаптера синхронизации .

  • Если ваше приложение использует фоновые службы, рассмотрите возможность использования JobScheduler или Firebase Cloud Messaging для запуска этих служб через определенные промежутки времени.

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

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

Некоторым приложениям, например играм или фильмам, экран должен оставаться включенным. Лучший способ сделать это — использовать FLAG_KEEP_SCREEN_ON в своем действии (и только в действии, а не в службе или другом компоненте приложения). Например:

Котлин

class MainActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
    }
}

Ява

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

Преимущество этого подхода заключается в том, что в отличие от блокировок пробуждения (обсуждаемых в разделе «Поддержание ЦП включенным ») он не требует специального разрешения, и платформа правильно управляет перемещением пользователя между приложениями, и вашему приложению не нужно беспокоиться об освобождении неиспользуемых ресурсов.

Другой способ реализовать это — использовать XML-файл макета вашего приложения с помощью атрибута android:keepScreenOn :

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

Использование android:keepScreenOn="true" эквивалентно использованию FLAG_KEEP_SCREEN_ON . Вы можете использовать любой подход, который лучше всего подходит для вашего приложения. Преимущество программной установки флага в вашей деятельности заключается в том, что он дает вам возможность позже программно очистить флаг и тем самым позволить экрану выключиться.

Режим Ambient для телевизора

На телевизоре следует использовать FLAG_KEEP_SCREEN_ON , чтобы предотвратить переход устройства в Ambient Mode во время активного воспроизведения видео. Если FLAG_KEEP_SCREEN_ON не установлен в результате активности на переднем плане, устройство автоматически перейдет в Ambient Mode после периода бездействия.

Держите процессор включенным

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

Создание и удержание блокировки пробуждения может существенно повлиять на срок службы батареи хост-устройства. Таким образом, вам следует использовать блокировки пробуждения только в случае крайней необходимости и удерживать их как можно более короткое время. Например, вам никогда не понадобится использовать блокировку пробуждения в действии. Как описано выше, если вы хотите, чтобы экран был включен в вашей деятельности, используйте FLAG_KEEP_SCREEN_ON .

Одним из законных случаев использования блокировки пробуждения может быть фоновая служба, которой необходимо захватить блокировку пробуждения, чтобы ЦП продолжал работать, пока экран выключен. Опять же, эту практику следует свести к минимуму из-за ее влияния на срок службы батареи.

Чтобы использовать блокировку пробуждения, первым делом нужно добавить разрешение WAKE_LOCK в файл манифеста вашего приложения:

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

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

Котлин

val wakeLock: PowerManager.WakeLock =
        (getSystemService(Context.POWER_SERVICE) as PowerManager).run {
            newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::MyWakelockTag").apply {
                acquire()
            }
        }

Ява

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

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