Почему я не могу получить фоновую задачу для регистрации данных в фоновом режиме в React Native, используя реакции-nativAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Почему я не могу получить фоновую задачу для регистрации данных в фоновом режиме в React Native, используя реакции-nativ

Сообщение Anonymous »

Я пытаюсь считывать данные акселерометра телефона Android каждые 5 секунд и записывать данные в файл 24 часа в сутки, 7 дней в неделю. Он должен иметь возможность работать в фоновом режиме. Я использую React Native с управляемой разработкой Expo.
Я работаю на телефоне Galaxy A13 с целевым SDK Android OS 14: 35.
Он работает нормально, пока приложение находится на переднем плане. Но как только приложение переходит в фоновый режим, оно перестает выполнять вход в файл.
Некоторые предлагали мне использовать службы Foreground, но они не должны быть знакомы с headless js и React-native-background-actions, которые делают именно это.
Моя частота дискретизации слишком высока? Я попробовал 15 минут и происходит то же самое. Я заметил, что другие фоновые библиотеки (expo-background-task и response-native-background-fetch) ограничивают время 15 минутами (а не 5 секундами). Но я не вижу никаких ограничений в документации для реагирования-native-background-actionsb. Не работают ли реакции-родные-фоновые действия с новой архитектурой? Нужны ли мне дополнительные разрешения? Заранее благодарим за помощь!
Вот образец файла журнала, когда я выключаю приложение с переднего плана всего на несколько секунд:
2026-01-01 12:06:00: App mounted. Initial State: active
2026-01-01 12:06:02: App went to BACKGROUND (background)
2026-01-01 12:06:02: App came to FOREGROUND
2026-01-01 12:06:07: [BackgroundAccelerometerTask] 12:06:07 PM - x: 0.433, y: 0.290, z: 0.830
2026-01-01 12:06:12: [BackgroundAccelerometerTask] 12:06:12 PM - x: 0.314, y: 0.131, z: 0.879
2026-01-01 12:06:17: [BackgroundAccelerometerTask] 12:06:17 PM - x: 0.470, y: 0.101, z: 0.936
2026-01-01 12:06:22: [BackgroundAccelerometerTask] 12:06:22 PM - x: 0.482, y: 0.105, z: 0.850
2026-01-01 12:06:27: [BackgroundAccelerometerTask] 12:06:27 PM - x: 0.506, y: 0.110, z: 0.939
2026-01-01 12:06:32: [BackgroundAccelerometerTask] 12:06:32 PM - x: 0.553, y: 0.222, z: 0.946
2026-01-01 **12:06:32**: App went to BACKGROUND (background)
2026-01-01 **12:06:55**: App came to FOREGROUND
2026-01-01 12:06:55: [BackgroundAccelerometerTask] 12:06:55 PM - x: 0.534, y: 0.218, z: 0.793
2026-01-01 12:07:00: [BackgroundAccelerometerTask] 12:07:00 PM - x: 0.024, y: 0.072, z: 0.990

Я использую экспо-сенсоры и реагирующие фоновые действия.
Я использую реагирующую нативную версию 0.81.5; выставка 54.0.29; экспо-сенсоры 15.0.8; реакции-native-background-actions 4.0.1.
Вот как фоновая задача инициализируется на главном экране:
await BackgroundService.start(BackgroundAccelerometerTask, options);
...
const options = {
taskName: "BackgroundAccelerometerTask",
taskTitle: "Tracking Movement",
taskDesc: "Getting accelerometer data in the background",
taskIcon: {
name: "ic_launcher", // Make sure you have this icon in your Android mipmap folders
type: "mipmap",
},
color: "#ff00ff",
parameters: {
delay: 1000,
},
};


Вот фоновая задача
import BackgroundService from "react-native-background-actions";
import { Accelerometer } from "expo-sensors";
import LogService from "./LogService";
// Use react-native-sensors if not using Expo:
// import { Accelerometer } from 'react-native-sensors';

const sleep = (time) =>
new Promise((resolve) => setTimeout(() => resolve(), time));

const BackgroundAccelerometerTask = async (taskDataArguments) => {
// Example of storing data or doing something with it
const { delay } = taskDataArguments;
await new Promise(async (resolve) => {
// Set update interval (e.g., 5000ms)
Accelerometer.setUpdateInterval(5000);
const subscription = Accelerometer.addListener((accelerometerData) => {
// Process accelerometer data here
//console.log("Accelerometer data in background:", accelerometerData);
const localTime = new Date().toLocaleTimeString();
console.log(
"Accelerometer data in background:",
localTime,
accelerometerData.x,
accelerometerData.y,
accelerometerData.z
);
LogService.append(
`[BackgroundAccelerometerTask] ${localTime} - x: ${accelerometerData.x.toFixed(
3
)}, y: ${accelerometerData.y.toFixed(
3
)}, z: ${accelerometerData.z.toFixed(3)}`
);
});

// Keep the task running as long as needed.
// Note: On iOS, this will only run for a short time unless
// you enable specific background modes like 'location' or 'audio'.
// For Android, it can run as a foreground service indefinitely.
for (let i = 0; BackgroundService.isRunning(); i++) {
if (i % 10 === 0)
console.log(`[BackgroundAccelerometerTask] Heartbeat ${i}`);
await sleep(delay);
}

// Don't forget to remove the listener when the task stops
subscription.remove();
resolve();
});
};

export default BackgroundAccelerometerTask;


Вот разрешения, которые я использовал в AndroidManifest.xml



















Подробнее здесь: https://stackoverflow.com/questions/798 ... eact-nativ
Ответить

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

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

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

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

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