React Native点击推送冷启动应用时无法打开深层链接URL问题
问题原因
- RN初始化时序问题:前台运行时RN上下文、JS路由逻辑已经加载完成,所以跳转正常。冷启动时你将
startActivity逻辑放在onCreate中执行,此时RN引擎还未完成初始化,无法响应Deep Link跳转事件,所以出现执行了代码但无效果的情况。 singleTask启动模式关联问题:该启动模式下,Activity已经存在于栈中时不会触发onCreate回调,而是走onNewIntent,你目前仅在onCreate中处理推送参数,会漏处理应用在后台运行时点击通知的场景,也会导致跳转失效。- 跳转时机错误:在MainActivity未完成初始化的阶段直接启动新的
ACTION_VIEWIntent,容易被系统生命周期逻辑拦截,导致跳转失败。
修复方案
1. 调整Intent处理逻辑,补充RN初始化监听
将推送参数处理逻辑封装为公共方法,同时在onCreate和onNewIntent中调用,新增RN初始化完成监听,等RN上下文准备好之后再执行跳转,修改后的代码如下:
package com.myapp; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.util.Log; import com.facebook.react.ReactActivity; import com.facebook.react.ReactInstanceManager; import com.facebook.react.bridge.ReactContext; public class MainActivity extends ReactActivity { final String TAG = "MAIN"; private Uri pendingDeepLinkUri = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(null); handleIntent(getIntent()); // 监听RN初始化完成后再处理待跳转的Deep Link getReactNativeHost().getReactInstanceManager().addReactInstanceEventListener( new ReactInstanceManager.ReactInstanceEventListener() { @Override public void onReactContextInitialized(ReactContext context) { if (pendingDeepLinkUri != null) { Intent intent = new Intent(Intent.ACTION_VIEW, pendingDeepLinkUri); startActivity(intent); pendingDeepLinkUri = null; } getReactNativeHost().getReactInstanceManager().removeReactInstanceEventListener(this); } }); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); handleIntent(intent); // RN已初始化完成则直接跳转 if (getReactNativeHost().getReactInstanceManager().hasStartedCreatingInitialContext() && pendingDeepLinkUri != null) { Intent viewIntent = new Intent(Intent.ACTION_VIEW, pendingDeepLinkUri); startActivity(viewIntent); pendingDeepLinkUri = null; } } private void handleIntent(Intent intent) { final String tenantId = intent.getStringExtra("tenantId"); if (tenantId != null) { String uriString = BuildConfig.URL_SCHEME + "://tenant/" + tenantId; Log.d(TAG, uriString); pendingDeepLinkUri = Uri.parse(uriString); } } @Override protected String getMainComponentName() { return "myapp"; } }
2. 检查配置项
- 确认
AndroidManifest.xml中处理Deep Link的Activity已经正确配置<intent-filter>,包含ACTION_VIEW、CATEGORY_DEFAULT、CATEGORY_BROWSABLE,以及你自定义的scheme和host配置。 - 确认推送通知的
PendingIntent设置了FLAG_UPDATE_CURRENT标识,避免冷启动时intent携带的extra参数被旧缓存覆盖。
内容的提问来源于stack exchange,提问作者Hamad Safdar
相关产品推荐
相关产品推荐

