You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native(JS)+Java原生应用接收外部文本时控制台打印日志递增问题

问题原因

打印次数递增核心是事件监听重复注册未清理,额外还有singleTask启动模式下新Intent无法被正常处理的潜在问题:

  1. React Native侧DeviceEventEmitter注册监听后没有对应的销毁逻辑,组件重新挂载/热重载时会重复添加监听,同一个事件触发时会执行多个回调,导致打印次数累加。
  2. 安卓侧配置了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 11:57:01