Альтернатива безголовому JSAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Альтернатива безголовому JS

Сообщение Anonymous »

Я пытаюсь написать приложение React Native, которое выполняет некоторую обработку каждые 15 минут. Если быть конкретнее: я хочу получить статус из открытого стороннего API и создать уведомление, если этот статус изменился.
Я подумал, что могу использовать для этого модуль React Native и Headless JS. это:
  • Используйте собственный модуль для создания диспетчера работ:
a . Сторона JS:

Код: Выделить всё

import { NativeModules } from "react-native";

const { WorkerModule } = NativeModules;

WorkerModule.configureWorker();
б. Собственная сторона:

Код: Выделить всё

class WorkerModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {

var context = reactContext.getApplicationContext()

override fun getName() = "WorkerModule"

@ReactMethod fun configureWorker() {
val periodicRequest = PeriodicWorkRequest
.Builder(MyWorker::class.java, 15, TimeUnit.MINUTES)
.setInitialDelay(10, TimeUnit.SECONDS)
.build()

WorkManager
.getInstance(this.context)
.enqueueUniquePeriodicWork("unique_work_name", ExistingPeriodicWorkPolicy.UPDATE, periodicRequest)
}
}

  • Зарегистрируйте функцию JavaScript в Headless JS (согласно документации HeadlessJS)
а. Сторона JS:

Код: Выделить всё

AppRegistry.registerHeadlessTask("myBackgroundFetchFunction", (...args) => {
console.log('woo! im a react native background javascript task')
// do my fetch and notification logic in javascript
});
б. Собственная сторона

Код: Выделить всё

class JsTaskService : HeadlessJsTaskService() {
override fun getTaskConfig(intent: Intent): HeadlessJsTaskConfig? {
return intent.extras?.let {
HeadlessJsTaskConfig(
"myBackgroundFetchFunction",
null,
5000, // timeout for the task
true // optional: defines whether or not the task is allowed in foreground.
// Default is false            )
}
}
}
  • Использовать встроенный рабочий процесс для вызова моей функции JavaScript с помощью Headless JS:

Код: Выделить всё

class MyWorker(context: Context, private val workParams: WorkerParameters) : Worker(context, workParams) {
override fun doWork(): Result {
Log.d("MyWorker", "im a background task running in kotlin")
val service = Intent(applicationContext, JsTaskService::class.java);

HeadlessJsTaskService.acquireWakeLockNow(applicationContext)

applicationContext.startForegroundService(service)

// or for older version of android:
// applicationContext.startService(service)
return Result.success()
}
}
  • Зарегистрируйте службу в AndroidManifest:

Код: Выделить всё

...

...




Однако на моем устройстве под управлением Android 14 я получаю ошибки при попытке запустить строку applicationContext.startForegroundService(service).

Код: Выделить всё

android.app.ForegroundServiceStartNotAllowedException: startForegroundService() not allowed due to mAllowStartForeground false
Я понимаю, что это связано с тем, что в Android 14 больше невозможно запустить службу переднего плана из фоновых служб.
Я также видел это Headless JS не поддерживается и не рекомендуется командой React Native и не используется внутри Meta

Вопросы:
  • Какие альтернативы у нас есть для запуска кода JavaScript в фоновом режиме наших приложений React Native?
  • Есть ли какие-либо примеры, которым можно следовать и которые позволяют Функции javascript для запуска в фоновом режиме приложения React Native в последних версиях Android 14 SDK версии 34+?


Подробнее здесь: https://stackoverflow.com/questions/790 ... eadless-js
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»