53
votes

If my React Native app fails to connect to its backend, I show an Alert with an OK button. If this happens, there's no point in the app continuing to run, so I'd like to shut it down when the button is clicked. How do I do this?

I suspect the key is in AppRegistry but the docs are a bit scant.

6

6 Answers

87
votes

For Android, Use BackHandler to exit the App:

import React, { BackHandler } from 'react-native';

BackHandler.exitApp();
41
votes

I am answering the question too late, but i thought the way i have chosen might help someone, so I am answering this question.

componentWillMount() {
   BackHandler.addEventListener('hardwareBackPress', this.backPressed);
}

componentWillUnmount() {
   BackHandler.removeEventListener('hardwareBackPress', this.backPressed);
}

backPressed = () => {
  Alert.alert(
    'Exit App',
    'Do you want to exit?',
    [
      {text: 'No', onPress: () => console.log('Cancel Pressed'), style: 'cancel'},
      {text: 'Yes', onPress: () => BackHandler.exitApp()},
    ],
    { cancelable: false });
    return true;
}
20
votes

There's no react-native specific way to do this today. You'd have to accomplish this from the native side of things.

Further, are you developing for iOS? Apple has stated that apps should not close themselves.

15
votes

Write a native module that performs the following actions when called:

IOS:

exit(9);

ANDROID:

((YourApplication) self.getApplicationContext()).kill();

...EDIT...

Or just use the one I created: https://www.npmjs.com/package/react-native-exit-app

7
votes

This npm module helped me with the same issue - react-native-exit-app

import RNExitApp from 'react-native-exit-app';
...
RNExitApp.exitApp();
...
7
votes

This is how I've achieved it:

  componentWillMount() {
    BackHandler.addEventListener('hardwareBackPress', this.handleBackButtonClick);
  }
  componentWillUnmount() {
    BackHandler.removeEventListener('hardwareBackPress', this.handleBackButtonClick);
  }
  handleBackButtonClick() {
    BackHandler.exitApp();
    return true;
  }