React Native(JS)+Java原生应用接收外部文本时控制台打印日志递增问题
问题原因
打印次数递增核心是事件监听重复注册未清理,额外还有singleTask启动模式下新Intent无法被正常处理的潜在问题:
- React Native侧
DeviceEventEmitter注册监听后没有对应的销毁逻辑,组件重新挂载/热重载时会重复添加监听,同一个事件触发时会执行多个回调,导致打印次数累加。 - 安卓侧配置了
singleTask启动模式,应用在后台运行时新的文本选择Intent不会触发onCreate方法,只会回调onNewIntent,现有逻辑仅在onCreate中处理Intent,会导致后续传入的文本无法被接收。
修复方案
1. 修改App.js,添加监听销毁逻辑
import React, { useEffect } from "react" import {DeviceEventEmitter, View} from "react-native" export default function App() { useEffect(() => { const eventSubscription = DeviceEventEmitter.addListener("EventReminder", (data) => { console.log(data.eventProperty) }) // 组件卸载时自动销毁监听,避免重复注册 return () => eventSubscription.remove() }, []) return <View/> }
2. 修改MainActivity.java,适配singleTask模式的Intent处理
新增onNewIntent重写逻辑,将Intent处理抽为公共方法,确保每次新传入的文本都能被正常发送到RN侧:
package com.translationapp; import com.facebook.react.ReactActivity; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.ReactContext; import com.facebook.react.bridge.WritableMap; import com.facebook.react.modules.core.DeviceEventManagerModule; import android.content.Intent; import android.content.res.Configuration; import android.os.Build; import android.os.Bundle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import java.util.Objects; public class MainActivity extends ReactActivity { @Override protected String getMainComponentName() { return "translationApp"; } @Override public void onConfigurationChanged(@NonNull Configuration newConfig) { super.onConfigurationChanged(newConfig); getReactInstanceManager().onConfigurationChanged(this, newConfig); } @RequiresApi(api = Build.VERSION_CODES.M) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(null); processIntent(getIntent()); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); processIntent(intent); } private void processIntent(Intent intent) { if (intent.getAction() != null && intent.getStringExtra(Intent.EXTRA_PROCESS_TEXT) != null) { String text = Objects.requireNonNull(intent.getCharSequenceExtra(Intent.EXTRA_PROCESS_TEXT)).toString(); WritableMap params = Arguments.createMap(); params.putString("eventProperty", text); sendEvent(Objects.requireNonNull(getReactInstanceManager().getCurrentReactContext()), params); } } private void sendEvent(ReactContext reactContext, @Nullable WritableMap params) { reactContext .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) .emit("EventReminder", params); } }
AndroidManifest.xml无需修改。
内容的提问来源于stack exchange,提问作者SoF
相关产品推荐
相关产品推荐

