react-native android上的后台服务

时间:2016-01-08 22:56:38

标签: android react-native

有没有办法在android上使用react-native创建后台服务? 我希望某种计时器每小时左右醒来,并启动一个简单的JavaScript任务。

5 个答案:

答案 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 queuereact 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();