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

React Native点击推送冷启动应用时无法打开深层链接URL问题

问题原因

  1. RN初始化时序问题:前台运行时RN上下文、JS路由逻辑已经加载完成,所以跳转正常。冷启动时你将startActivity逻辑放在onCreate中执行,此时RN引擎还未完成初始化,无法响应Deep Link跳转事件,所以出现执行了代码但无效果的情况。
  2. singleTask启动模式关联问题:该启动模式下,Activity已经存在于栈中时不会触发onCreate回调,而是走onNewIntent,你目前仅在onCreate中处理推送参数,会漏处理应用在后台运行时点击通知的场景,也会导致跳转失效。
  3. 跳转时机错误:在MainActivity未完成初始化的阶段直接启动新的ACTION_VIEW Intent,容易被系统生命周期逻辑拦截,导致跳转失败。

修复方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:45:04