Repository: react-native
Issue: Android ReactActivity Destroy Prevents Successful OnActivityResult Calls
Labels: Platform: Android,Needs: Triage :mag:

## Description
If a native module opens an activity that redirects out of the application and the application is killed in the background by the Android OS, the react context is lost and the native module's activity is unable to call `onActivityResult`.

If the redirect from the third party app is back to the activity in the native module, the `ReactActivity` is not created at this point.  When the native activity then sets result and finishes to return back to the `ReactActivity` the `ReactActivity` has to start up.

The React Native startup flow is:
1. `ReactActivity#onCreate`
1. `ReactActivityDelegate#onCreate`
1. `ReactActivityDelegate#loadApp`
1. `ReactDelegate#loadApp`
1. `ReactRootView#startReactApplication`
1. `ReactInstanceManager#createReactContextInBackground`
1. `ReactInstanceManager#recreateReactContextInBackgroundInner`
1. `ReactInstanceManager#recreateReactContextInBackgroundFromBundleLoader`
1. `ReactInstanceManager#recreateReactContextInBackground`
1. `ReactInstanceManager#runCreateReactContextOnNewThread`

At this point `ReactInstanceManager#setupReactContext` is called on a background thread.

Meanwhile, `ReactActivity#onActivityResult` is called.  In the Android activity lifecycle `onActivityResult` is called even before `onResume` (for [reference](https://developer.android.com/reference/android/app/Activity.html#onActivityResult(int,%20int,%20android.content.Intent)).  The calls from `ReactActivity#onActivityResult` pass through a few layers and end up at `ReactInstanceManager#onActivityResult` which checks if the `ReactContext` is null

```
  @ThreadConfined(UI)
  public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
    ReactContext currentContext = getCurrentReactContext();
    if (currentContext != null) {
      currentContext.onActivityResult(activity, requestCode, resultCode, data);
    }
  }
```

Because the context is being built on a background thread there is no guarantee that `currentContext` will be initialized at this point. Furthermore `ReactInstanceManager#createReactContext` is a fairly intensive function so it is actually very likely that `currentContext` is null.

This means that `ReactContext#onActivityResult` is not called and therefore, the data cannot be passed back to the `ActivityEventListener` which in my sample is the `ReactContextBaseJavaModule`.


## React Native version:
```
System:
    OS: macOS 10.15.7
    CPU: (12) x64 Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz
    Memory: 118.90 MB / 32.00 GB
    Shell: 3.2.57 - /bin/bash
  Binaries:
    Node: 13.14.0 - ~/.nvm/versions/node/v13.14.0/bin/node
    Yarn: 1.22.5 - /usr/local/bin/yarn
    npm: 6.14.4 - ~/.nvm/versions/node/v13.14.0/bin/npm
    Watchman: 4.9.0 - /usr/local/bin/watchman
  Managers:
    CocoaPods: 1.9.3 - /usr/local/bin/pod
  SDKs:
    iOS SDK:
      Platforms: iOS 13.6, DriverKit 19.0, macOS 10.15, tvOS 13.4, watchOS 6.2
    Android SDK:
      API Levels: 19, 23, 26, 27, 28, 29
      Build Tools: 27.0.3, 28.0.3, 29.0.0, 29.0.1, 29.0.2
      System Images: android-21 | Google APIs Intel x86 Atom, android-23 | Google APIs Intel x86 Atom, android-26 | Google Play Intel x86 Atom, android-28 | Google APIs Intel x86 Atom, android-29 | Google Play Intel x86 Atom, android-Q | Android TV Intel x86 Atom
      Android NDK: Not Found
  IDEs:
    Android Studio: 4.0 AI-193.6911.18.40.6626763
    Xcode: 11.6/11E708 - /usr/bin/xcodebuild
  Languages:
    Java: 1.8.0_265 - /usr/bin/javac
    Python: 2.7.16 - /usr/bin/python
  npmPackages:
    @react-native-community/cli: Not Found
    react: 16.13.1 => 16.13.1 
    react-native: 0.63.3 => 0.63.3 
    react-native-macos: Not Found
  npmGlobalPackages:
    *react-native*: Not Found
```

## Steps To Reproduce

1. Clone 
1. https://github.com/zsweigart/react-native-crash
1. cd into the directory and run `react-native run-android`
1. On your device or emulator go to [developer options](https://developer.android.com/studio/debug/dev-options) 
1. Turn `Do Not Keep Activities` to `On`
1. Set `Background Process Limit` to `No background processes`
1. Click `Open Activity`
1. Click `Go to Web` -> This should kill the original process in the background due to your developer settings; however, on some emulators I have noticed it does not. One way to guarantee this is to run `adb shell am kill com.react_native_crash` which will simulate a system process kill. *Note* you cannot kill the process by swiping it away because the OS will lose the information about the backstack.
1. Next run `adb shell am start -n com.react_native_crash/.RedirectActivity -d "redirect://crash"`
1. Click `Return Result`

## Expected Results
After these steps in the console you should see
```
 LOG      RESULT
 LOG      Completed
```
which would indicate the `onActivityResult` was called properly and the callback to the js code was executed.

## Snack, code example, screenshot, or link to a repository:
https://github.com/zsweigart/react-native-crash