有没有办法在android上使用react-native创建后台服务? 我希望某种计时器每小时左右醒来,并启动一个简单的JavaScript任务。
答案 0 :(得分:11)
是的,可以做到。
React native在本地(java / Objc)到JS桥之上运行,具有“native”和JS模块的概念(模块可以具有可以从桥的“其他”侧调用的方法)。所有的UI东西都建立在桥的顶部(处理生成视图的主“本机”模块称为“UIManager”)。可以直接使用网桥,唯一的限制是通信必须是异步的。
您可以从JAVA代码调用javascript函数。 Check this link用于文档。
答案 1 :(得分:9)
现在发布v0.36支持headless-js,只支持Android。
https://facebook.github.io/react-native/docs/headless-js-android.html
答案 2 :(得分:8)
绝对。事实上,现在使用react native queue和react native background task完全用JS(无需编写本机代码)跨平台实现这一目标非常容易。
有一些限制。后台任务只会以最短的间隔大约每15分钟触发一次(如果它甚至根本不发射,时间也不会完美 - iOS / Android调度程序是一种黑盒子,可以看到电池续航时间,当前cpu load等,在确定何时触发预定任务时)。此任务仅限于执行30秒。
I've written a tutorial on how to set all this up here
如果您在启动和运行时遇到任何困难,请告诉我。
答案 3 :(得分:1)
在我的情况下,该用户正在使用react-native-background-job
库来运行后台服务。杀死应用程序后,它可以正常工作。
https://github.com/vikeri/react-native-background-job
import BackgroundJob from "react-native-background-job";
const regularJobKey = "regularJobKey";
BackgroundJob.register({
jobKey: regularJobKey,
job: () => {
console.log('Background Service Call!');
}
});
<TouchableHighlight
onPress={() => {
BackgroundJob.schedule({
jobKey: regularJobKey,
period: 2000
});
}}
>
<Text>Schedule regular job</Text>
</TouchableHighlight>
此处的示例:https://github.com/vikeri/react-native-background-job/blob/master/example/index.android.js
答案 4 :(得分:0)
尝试使用 react-native-background-actions ,即使对于iOS来说,这也是一项非常出色的服务,并且他们还提供了ProgressBar功能。
yarn add react-native-background-actions
或npm:
npm install --save react-native-background-actions
有关如何使用它的简短代码段。
import BackgroundService from 'react-native-background-actions';
// You can do anything in your task such as network requests, timers and so on,
// as long as it doesn't touch UI. Once your task completes (i.e. the promise is resolved),
// React Native will go into "paused" mode (unless there are other tasks running,
// or there is a foreground app).
const veryIntensiveTask = async (taskDataArguments) => {
// Example of an infinite loop task
const { delay } = taskDataArguments;
await new Promise((resolve) => {
for (let i = 0; BackgroundService.isRunning(); i++) {
console.log(i);
await sleep(delay);
}
});
};
const options = {
taskName: 'Example',
taskTitle: 'ExampleTask title',
taskDesc: 'ExampleTask description',
taskIcon: {
name: 'ic_launcher',
type: 'mipmap',
},
color: '#ff00ff',
linkingURI: 'yourSchemeHere://chat/jane', // See Deep Linking for more info
parameters: {
delay: 1000,
},
};
await BackgroundService.start(veryIntensiveTask, options);
await BackgroundService.updateNotification({taskDesc: 'New ExampleTask description'}); // Only Android, iOS will ignore this call
// iOS will also run everything here in the background until .stop() is called
await BackgroundService.stop();