diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactContext.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactContext.java index db25b0d73..05d312360 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactContext.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactContext.java @@ -11,6 +11,7 @@ package com.facebook.react.bridge; import javax.annotation.Nullable; +import java.lang.ref.WeakReference; import java.util.concurrent.CopyOnWriteArraySet; import android.app.Activity; @@ -21,8 +22,8 @@ import android.os.Bundle; import android.view.LayoutInflater; import com.facebook.infer.annotation.Assertions; -import com.facebook.react.bridge.queue.ReactQueueConfiguration; import com.facebook.react.bridge.queue.MessageQueueThread; +import com.facebook.react.bridge.queue.ReactQueueConfiguration; /** * Abstract ContextWrapper for Android applicaiton or activity {@link Context} and @@ -41,7 +42,7 @@ public class ReactContext extends ContextWrapper { private @Nullable MessageQueueThread mNativeModulesMessageQueueThread; private @Nullable MessageQueueThread mJSMessageQueueThread; private @Nullable NativeModuleCallExceptionHandler mNativeModuleCallExceptionHandler; - private @Nullable Activity mCurrentActivity; + private @Nullable WeakReference mCurrentActivity; public ReactContext(Context base) { super(base); @@ -142,7 +143,7 @@ public class ReactContext extends ContextWrapper { */ public void onHostResume(@Nullable Activity activity) { UiThreadUtil.assertOnUiThread(); - mCurrentActivity = activity; + mCurrentActivity = new WeakReference(activity); for (LifecycleEventListener listener : mLifecycleEventListeners) { listener.onHostResume(); } @@ -241,7 +242,7 @@ public class ReactContext extends ContextWrapper { } public boolean hasCurrentActivity() { - return mCurrentActivity != null; + return mCurrentActivity != null && mCurrentActivity.get() != null; } /** @@ -250,8 +251,9 @@ public class ReactContext extends ContextWrapper { * was called before the context is in the right state. */ public boolean startActivityForResult(Intent intent, int code, Bundle bundle) { - Assertions.assertNotNull(mCurrentActivity); - mCurrentActivity.startActivityForResult(intent, code, bundle); + Activity activity = getCurrentActivity(); + Assertions.assertNotNull(activity); + activity.startActivityForResult(intent, code, bundle); return true; } @@ -261,6 +263,9 @@ public class ReactContext extends ContextWrapper { * MEMORY LEAKS. */ /* package */ @Nullable Activity getCurrentActivity() { - return mCurrentActivity; + if (mCurrentActivity == null) { + return null; + } + return mCurrentActivity.get(); } }