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

React Native集成Braintree PayPal时新Activity销毁主Activity问题求助

问题解决:阻止PayPalActivity销毁React Native主应用Activity

核心问题分析

你的问题根源主要有两点:一是PayPalActivity错误继承了ReactActivity,导致React Native实例冲突触发主Activity销毁;二是Activity启动模式和任务栈配置不当,引发任务栈分离导致主Activity被系统回收。

分步解决方案

1. 修改PayPalActivity的父类

将PayPalActivity从ReactActivity改为普通的AppCompatActivity,避免React Native生命周期冲突:

public class PayPalActivity extends AppCompatActivity implements PayPalListener {

  private BraintreeClient braintreeClient;
  private PayPalClient payPalClient;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    String clientToken = getIntent().getStringExtra("clientToken");
    braintreeClient = new BraintreeClient(this, clientToken);
    payPalClient = new PayPalClient(this, braintreeClient);
    payPalClient.setListener(this);
    this.myTokenizePayPalAccountWithCheckoutMethod();
  }

  // 保留原有支付逻辑方法...

  @Override
  public void onPayPalSuccess(@NonNull PayPalAccountNonce payPalAccountNonce) {
    // 可通过Intent传递结果给主Activity,或用React Native事件回调
    finish(); // 支付完成后关闭当前Activity,返回主应用
  }

  @Override
  public void onPayPalFailure(@NonNull Exception error) {
    finish(); // 失败时同样关闭当前Activity
  }
}

2. 调整AndroidManifest.xml中PayPalActivity的配置

添加启动模式配置,确保Activity在当前任务栈中启动:

<activity android:name=".activity.PayPalActivity"
    android:exported="true"
    android:launchMode="standard">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="${applicationId}.braintree" />
    </intent-filter>
</activity>

3. 修改原生模块的Intent调用方式

使用startActivityForResult启动Activity,不添加可能导致任务栈分离的Flag:

@ReactMethod
public void paypalPaymentRequest(ReadableMap options, Promise promise) {
    String clientToken = options.getString("clientToken");
    Activity currentActivity = getCurrentActivity();

    if (currentActivity == null) {
        promise.reject("ACTIVITY_NULL", "当前Activity为空");
        return;
    }

    Intent intent = new Intent(currentActivity, PayPalActivity.class);
    intent.putExtra("clientToken", clientToken);
    // 使用startActivityForResult确保在当前任务栈启动,后续可接收支付结果
    currentActivity.startActivityForResult(intent, 1001); 
}

4. 确认主Activity的启动模式

检查主Activity(通常是MainActivity)的Manifest配置,确保启动模式为standard或singleTask:

<activity
    android:name=".MainActivity"
    android:label="@string/app_name"
    android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode"
    android:launchMode="standard"
    android:windowSoftInputMode="adjustResize">
    <!-- 其他原有配置 -->
</activity>

内容的提问来源于stack exchange,提问作者fatlinesofcode

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 23:17:48