From f38a95e6354677ececde40cfd01cd54773c11d96 Mon Sep 17 00:00:00 2001 From: sozinov Date: Wed, 13 May 2026 12:29:30 +0300 Subject: [PATCH] MOBILE-175: Fix ReactContext listener cleanup on Android --- .../mindboxsdk/MindboxSdkLifecycleListener.kt | 29 +++++++++++++------ 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/android/src/main/java/com/mindboxsdk/MindboxSdkLifecycleListener.kt b/android/src/main/java/com/mindboxsdk/MindboxSdkLifecycleListener.kt index 0453b12..38d03e1 100644 --- a/android/src/main/java/com/mindboxsdk/MindboxSdkLifecycleListener.kt +++ b/android/src/main/java/com/mindboxsdk/MindboxSdkLifecycleListener.kt @@ -55,6 +55,7 @@ internal class MindboxSdkLifecycleListener private constructor( private var activityEventListener: ActivityEventListener? = null private var reactInstanceEventListener: ReactInstanceEventListener? = null + private var reactInstanceEventListenerActivity: Activity? = null private fun onReactContextAvailable(reactContext: ReactContext, activity: Activity) { Mindbox.writeLog("[RN] ReactContext ready", Level.INFO) @@ -62,7 +63,7 @@ internal class MindboxSdkLifecycleListener private constructor( subscriber.onEvent(MindboxSdkLifecycleEvent.ActivityCreated(reactContext, activity)) } - private fun registerReactContextListener(onReady: (ReactContext) -> Unit) { + private fun registerReactContextListener(activity: Activity, onReady: (ReactContext) -> Unit) { val host = getReactHost(application) ?: run { Mindbox.writeLog( "[RN] registerReactContextListener: ReactHost is null, skip listener.", @@ -70,14 +71,23 @@ internal class MindboxSdkLifecycleListener private constructor( ) return } - reactInstanceEventListener?.let { host.removeReactInstanceEventListener(it) } + reactInstanceEventListener?.let { previousListener -> + host.removeReactInstanceEventListener(previousListener) + } + reactInstanceEventListenerActivity = null val listener = object : ReactInstanceEventListener { override fun onReactContextInitialized(context: ReactContext) { Mindbox.writeLog("[RN] ReactContext initialized (listener)", Level.INFO) + host.removeReactInstanceEventListener(this) + if (reactInstanceEventListener === this) { + reactInstanceEventListener = null + reactInstanceEventListenerActivity = null + } onReady(context) } } reactInstanceEventListener = listener + reactInstanceEventListenerActivity = activity host.addReactInstanceEventListener(listener) } @@ -86,7 +96,7 @@ internal class MindboxSdkLifecycleListener private constructor( val hasConsumedReactContext = AtomicBoolean(false) - registerReactContextListener { reactContext -> + registerReactContextListener(activity) { reactContext -> if (hasConsumedReactContext.compareAndSet(false, true)) { onReactContextAvailable(reactContext, activity) } @@ -127,13 +137,14 @@ internal class MindboxSdkLifecycleListener private constructor( override fun onActivityDestroyed(activity: Activity) { if (!isMainActivity(activity)) return - subscriber.onEvent(MindboxSdkLifecycleEvent.ActivityDestroyed(activity)) - getReactContext()?.removeActivityEventListener(activityEventListener) - activityEventListener = null - reactInstanceEventListener?.let { listener -> - getReactHost(application)?.removeReactInstanceEventListener(listener) + if (reactInstanceEventListenerActivity === activity) { + reactInstanceEventListener?.let { listener -> + getReactHost(application)?.removeReactInstanceEventListener(listener) + } + reactInstanceEventListener = null + reactInstanceEventListenerActivity = null } - reactInstanceEventListener = null + subscriber.onEvent(MindboxSdkLifecycleEvent.ActivityDestroyed(activity)) } override fun onActivityStarted(activity: Activity) {}