Я подумал, что могу использовать для этого модуль React Native и Headless 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)
Код: Выделить всё
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.app.ForegroundServiceStartNotAllowedException: startForegroundService() not allowed due to mAllowStartForeground false
Я также видел это Headless JS не поддерживается и не рекомендуется командой React Native и не используется внутри Meta
Вопросы:
- Какие альтернативы у нас есть для запуска кода JavaScript в фоновом режиме наших приложений React Native?
- Есть ли какие-либо примеры, которым можно следовать и которые позволяют Функции javascript для запуска в фоновом режиме приложения React Native в последних версиях Android 14 SDK версии 34+?
Подробнее здесь: https://stackoverflow.com/questions/790 ... eadless-js
Мобильная версия