Background service on react-native android

AndroidReact Native

Android Problem Overview


Is there any way to create a background service with react-native on android? I would like some sort of timer that wakes up every hour or so, and launches a simple javascript task.

Android Solutions


Solution 1 - Android

Yes, It can be done.

React native operates on top of the native (java/Objc) to JS bridge with a concept of "native" and JS modules (modules can have methods that you may call from the "other" side of the bridge). All the UI stuff is built on top of the bridge (the main "native" module that handles generating views is called "UIManager"). It is possible to use bridge directly the only restriction is that the communication has to be asynchronous.

You can call the javascript function from the JAVA code. Check this link for the documentation.

Solution 2 - Android

Absolutely. In fact it's quite easy now to achieve this entirely in JS (no need to write native code) cross platform with react native queue and react native background task.

There are some limitations. The background task will only be fired roughly every 15 minutes at smallest intervals (and the timing isn't guaranteed to be perfect if it even fires at all - the iOS/Android scheduler is sort of a black box that looks at battery life, current cpu load, etc, when determining when to fire a scheduled task). Also the task is limited to 30 seconds of execution.

I've written a tutorial on how to set all this up here.

Let me know if you have any difficulty getting it up and running.

Solution 3 - Android

Release v0.36 support headless-js, only Android, for now.

https://facebook.github.io/react-native/docs/headless-js-android.html

Solution 4 - Android

It's Working in my case user the react-native-background-job library for running a background service. It's working after the kill the app. 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>

Example Here : https://github.com/vikeri/react-native-background-job/blob/master/example/index.android.js

Solution 5 - Android

Try to use react-native-background-actions, it's very great service even for iOS and they are providing the ProgressBar feature as well.

yarn add react-native-background-actions

or npm:

npm install --save react-native-background-actions

A short code snippet of how to use it.

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();

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionandriView Question on Stackoverflow
Solution 1 - AndroidSriramanView Answer on Stackoverflow
Solution 2 - AndroidbillmalarkyView Answer on Stackoverflow
Solution 3 - AndroidlironhelView Answer on Stackoverflow
Solution 4 - AndroidAkshay IView Answer on Stackoverflow
Solution 5 - AndroidIrshad BabarView Answer on Stackoverflow