diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/HeadlessJsTaskService.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/HeadlessJsTaskService.java index 70a8f7c105d47d..1fc175720395bd 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/HeadlessJsTaskService.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/HeadlessJsTaskService.java @@ -14,10 +14,13 @@ import android.content.Intent; import android.os.IBinder; import android.os.PowerManager; + +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.facebook.infer.annotation.Assertions; import com.facebook.react.bridge.ReactContext; import com.facebook.react.bridge.UiThreadUtil; +import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint; import com.facebook.react.jstasks.HeadlessJsTaskConfig; import com.facebook.react.jstasks.HeadlessJsTaskContext; import com.facebook.react.jstasks.HeadlessJsTaskEventListener; @@ -94,19 +97,11 @@ public static void acquireWakeLockNow(Context context) { protected void startTask(final HeadlessJsTaskConfig taskConfig) { UiThreadUtil.assertOnUiThread(); acquireWakeLockNow(this); - final ReactInstanceManager reactInstanceManager = - getReactNativeHost().getReactInstanceManager(); - ReactContext reactContext = reactInstanceManager.getCurrentReactContext(); + + ReactContext reactContext = getReactContext(); + if (reactContext == null) { - reactInstanceManager.addReactInstanceEventListener( - new ReactInstanceEventListener() { - @Override - public void onReactContextInitialized(ReactContext reactContext) { - invokeStartTask(reactContext, taskConfig); - reactInstanceManager.removeReactInstanceEventListener(this); - } - }); - reactInstanceManager.createReactContextInBackground(); + createReactContextAndScheduleTask(taskConfig); } else { invokeStartTask(reactContext, taskConfig); } @@ -166,4 +161,55 @@ public void onHeadlessJsTaskFinish(int taskId) { protected ReactNativeHost getReactNativeHost() { return ((ReactApplication) getApplication()).getReactNativeHost(); } + + /** + * Get the {@link ReactHost} used by this app. By default, assumes {@link #getApplication()} + * is an instance of {@link ReactApplication} and calls {@link + * ReactApplication#getReactHost()}. + * This method assumes it is called in new architecture and returns null if not. + */ + protected ReactHost getReactHost() { + return ((ReactApplication) getApplication()).getReactHost(); + } + + protected ReactContext getReactContext() { + if (DefaultNewArchitectureEntryPoint.getBridgelessEnabled()) { + ReactHost reactHost = getReactHost(); + Assertions.assertNotNull(reactHost, "React host is null in newArchitecture"); + return reactHost.getCurrentReactContext(); + } + + final ReactInstanceManager reactInstanceManager = + getReactNativeHost().getReactInstanceManager(); + return reactInstanceManager.getCurrentReactContext(); + } + + private void createReactContextAndScheduleTask(final HeadlessJsTaskConfig taskConfig) { + final ReactHost reactHost = getReactHost(); + + if (reactHost == null) { // old arch + final ReactInstanceManager reactInstanceManager = getReactNativeHost().getReactInstanceManager(); + + reactInstanceManager.addReactInstanceEventListener( + new ReactInstanceEventListener() { + @Override + public void onReactContextInitialized(@NonNull ReactContext reactContext) { + invokeStartTask(reactContext, taskConfig); + reactInstanceManager.removeReactInstanceEventListener(this); + } + }); + reactInstanceManager.createReactContextInBackground(); + } else { // new arch + reactHost.addReactInstanceEventListener( + new ReactInstanceEventListener() { + @Override + public void onReactContextInitialized(@NonNull ReactContext reactContext) { + invokeStartTask(reactContext, taskConfig); + reactHost.removeReactInstanceEventListener(this); + } + } + ); + reactHost.start(); + } + } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactHost.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactHost.kt index 5f09366417af32..84351e2412b415 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactHost.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactHost.kt @@ -131,6 +131,10 @@ public interface ReactHost { public fun onConfigurationChanged(context: Context) + public fun addReactInstanceEventListener(listener: ReactInstanceEventListener) + + public fun removeReactInstanceEventListener(listener: ReactInstanceEventListener) + public fun addBeforeDestroyListener(onBeforeDestroy: () -> Unit) public fun removeBeforeDestroyListener(onBeforeDestroy: () -> Unit)