Stop calling host.clear() when activity is destroyed (#1838)
This is a breaking change and has to be opt-in. To prevent host.clear from being called,
Override `clearHostOnActivityDestroy` in MainApplication and return false:
```java
@Override
public boolean clearHostOnActivityDestroy() {
return false;
}
```
If host isn't cleared, the next time the app is opened react context might still be initialized.
In this case we emit appLaunched event which has to be handled in Js:
```js
Promise.resolve(Navigation.isAppLaunched())
.then((appLaunched) => {
if (appLaunched) {
startApp();
}
new NativeEventsReceiver().appLaunched(() => {
startApp();
});
})
```
Currently startApp is called from global context which results in the
app being launched when headlessJs tasks run in the background.
In order to support this use case, while not breaking existing users,
this commit adds two mechanisms which should help users detrmine if
the native Activity is running and startApp can be called safely.
1. RNN.appLaunched event is emitted is SplashActivity starts and react
context has already been created. This is the use case of openeing
the app while headless js task was started or has just finished and
react context is in a "pasued" state.
2. Navigation.isAppLaunched() convenience method has been added.
It returns a promise which when resolved, indicates if the app
is launched and we should show the ui or not.
Usage
import {Navigation, NativeEventsReceiver} from 'react-native-navigation';
Promise.resolve(Navigation.isAppLaunched())
.then(appLaunched => {
if (appLaunched) {
startApp();
} else {
new NativeEventsReceiver().appLaunched(startApp);
}
});
function startApp() {
Navigation.startTabBasedApp({ ... });
}
This commit introduces a simple mechanism to pass deep link data from
MainActivity/SplashActivity to NavigationActivity. Note that this will
not work if the application is already running.