Skip to content

Android Headless Mode

Chris Scott edited this page Jun 27, 2018 · 7 revisions

BackgroundGeolocation implements the React Native Headless JS mechanism. With Headless JS, you can continue to respond to BackgroundGeolocation events after your app has been terminated (assuming you've configured stopOnTerminate: false).

Step 1: enableHeadless: true.

Where you execute BackgroundGeolocation#configure, add the following options:

export default class App extends Component {
  componentDidMount() {
    
    BackgroundGeolocation.ready({
      enableHeadless: true,
      stopOnTerminate: false,  // <-- required for Headless JS
      .
      .
      .
    }, (state) => {
      console.log('- Configure success');
    });

Step 2: BackgroundGeolocation#registerHeadlessTask

In your application's app.js file, register your Javascript Headless Task:

πŸ“‚ index.js

import * as application from 'application';

import {BackgroundGeolocation} from "nativescript-background-geolocation-lt";

BackgroundGeolocation.registerHeadlessTask((event, completionHandler) => {
  console.log('[My Headless Task: ', event.name, event.params);
  // Do stuff.
  completionHandler();  // <-- signal completion of your HeadlessTask
});

application.run({ moduleName: 'app-root' });

Testing

To test HeadlessJS, boot your app and connect the developer console. Terminate your app and observe console messages arriving from your registered HeadlessTask:

In $ adb logcat, you'll see HeadlessTask events prefixed with the "πŸ’€" icon (as in dead / terminated). These "πŸ’€" events are logged just before being sent to your HeadlessTask:

$ adb logcat -s TSLocationManager

TSLocationManager: [c.t.r.HeadlessTask <init>] πŸ’€  event: terminate
TSLocationManager: [c.t.l.a.BackgroundGeolocation isMainActivityActive] NO
TSLocationManager: [c.t.r.HeadlessTask onHeadlessJsTaskStart] taskId: 1
TSLocationManager: [c.t.l.BackgroundGeolocationService onActivityRecognitionResult] 
TSLocationManager: [c.t.r.HeadlessTask <init>] πŸ’€  event: activitychange
TSLocationManager: [c.t.l.a.BackgroundGeolocation isMainActivityActive] NO
TSLocationManager: [c.t.r.HeadlessTask onHeadlessJsTaskFinish] taskId: 1
TSLocationManager: [c.t.l.a.BackgroundGeolocation isMainActivityActive] NO
TSLocationManager: [c.t.l.BackgroundGeolocationService onActivityRecognitionResult] 
TSLocationManager: [c.t.r.HeadlessTask <init>] πŸ’€  event: activitychange
TSLocationManager: [c.t.r.HeadlessTask onHeadlessJsTaskStart] taskId: 3
TSLocationManager: [c.t.l.a.BackgroundGeolocation isMainActivityActive] NO
TSLocationManager: [c.t.r.HeadlessTask onHeadlessJsTaskFinish] taskId: 3
TSLocationManager: [c.t.l.LocationService onHeartbeat] ❀️
TSLocationManager: [c.t.l.a.BackgroundGeolocation isMainActivityActive] NO
TSLocationManager: [c.t.r.HeadlessTask <init>] πŸ’€  event: heartbeat

Clone this wiki locally