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
相关产品推荐
相关产品推荐

