Headless JS¶
Headless JS — это способ выполнения задач на JavaScript, пока ваше приложение находится в фоновом режиме. Его можно использовать, например, для синхронизации свежих данных, обработки push-уведомлений или воспроизведения музыки.
JS API¶
Задача — это асинхронная функция, которую вы регистрируете в AppRegistry
, аналогично регистрации приложений React:
1 2 3 4 |
|
Затем, в SomeTaskName.js
:
1 2 3 |
|
Вы можете делать в своей задаче все, что угодно, например, сетевые запросы, таймеры и так далее, если это не затрагивает пользовательский интерфейс. Как только ваша задача завершится (т.е. обещание будет выполнено), React Native перейдет в режим "паузы" (если только не запущены другие задачи или нет приложения на переднем плане).
API платформы¶
Да, это все еще требует некоторого нативного кода, но он довольно тонкий. Вам нужно расширить HeadlessJsTaskService
и переопределить getTaskConfig
, например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
Затем добавьте службу в файл AndroidManifest.xml
:
1 |
|
Теперь, всякий раз, когда вы запускаете свою службу, например, в качестве периодической задачи или в ответ на какое-то системное событие / трансляцию, JS будет раскручиваться, выполнять свою задачу, а затем сворачиваться.
Пример:
1 2 3 4 5 6 7 |
|
1 2 3 4 5 6 7 8 |
|
Повторные попытки¶
По умолчанию задача headless JS не будет выполнять никаких повторных попыток. Для этого необходимо создать HeadlessJsRetryPolicy
и бросить определенную Error
.
LinearCountingRetryPolicy
— это реализация HeadlessJsRetryPolicy
, которая позволяет вам указать максимальное количество повторных попыток с фиксированной задержкой между каждой попыткой. Если это не подходит для ваших нужд, вы можете реализовать собственную HeadlessJsRetryPolicy
. Эти политики могут быть переданы в качестве дополнительного аргумента в конструктор HeadlessJsTaskConfig
, например.
1 2 3 4 5 6 7 8 9 10 11 12 |
|
1 2 3 4 5 6 7 |
|
Повторная попытка будет предпринята только в случае возникновения определенной ошибки
. Внутри безголовой JS-задачи можно импортировать ошибку и бросать ее, когда требуется повторная попытка.
Пример:
1 2 3 4 5 6 7 8 |
|
Если вы хотите, чтобы все ошибки вызывали повторную попытку, вам нужно перехватить их и выдать вышеуказанную ошибку.
Предостережения¶
- Функция, переданная в
setTimeout
, не всегда ведет себя так, как ожидается. Вместо этого функция вызывается только при повторном запуске приложения. Если вам нужно только подождать, используйте функцию повторного запуска. - По умолчанию ваше приложение аварийно завершается, если вы пытаетесь запустить задачу, когда приложение находится на переднем плане. Это сделано для того, чтобы разработчики не прострелили себе ногу, выполняя много работы в задаче и замедляя работу пользовательского интерфейса. Вы можете передать четвертый аргумент
boolean
для управления этим поведением. - Если вы запускаете свой сервис из
BroadcastReceiver
, обязательно вызовитеHeadlessJsTaskService.acquireWakeLockNow()
перед возвратом изonReceive()
.
Пример использования¶
Сервис может быть запущен из Java API. Сначала вам нужно решить, когда сервис должен быть запущен, и реализовать ваше решение соответствующим образом. Вот пример, который реагирует на изменение сетевого соединения.
Следующие строки показывают часть файла манифеста Android для регистрации широковещательного приемника.
1 2 3 4 5 6 7 |
|
Приемник широковещания затем обрабатывает намерение, которое было передано в функции onReceive. Это отличное место, чтобы проверить, находится ли ваше приложение на переднем плане или нет. Если приложение не на переднем плане, мы можем подготовить наше намерение к запуску, без информации или с дополнительной информацией, собранной с помощью putExtra
(помните, что пакет может обрабатывать только посылочные значения). В итоге сервис запускается и wakelock приобретается.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
|