从Firebase动态链接跳转时恢复WebViewActivity而非重启React主Activity
解决Firebase动态链接跳转回WebViewActivity而非重启MainActivity的问题
问题核心
你的场景是从React Native的MainActivity启动WebViewActivity做OTP验证,验证后通过Firebase动态链接返回应用时,系统默认重启了MainActivity,而非恢复后台的WebViewActivity。即便把动态链接的intent-filter移到WebViewActivity的Manifest中,问题依然存在,这大概率是Activity启动模式未配置正确,以及未正确处理动态链接的Intent回调导致的。
具体解决方案
1. 配置WebViewActivity的启动模式
在AndroidManifest.xml中,给WebViewActivity添加android:launchMode="singleTask",确保系统不会重复创建该Activity实例,而是复用后台已存在的实例并触发onNewIntent方法:
<activity android:name=".WebViewActivity" android:screenOrientation="portrait" android:exported="true" android:launchMode="singleTask"> <!-- 新增启动模式配置 --> <intent-filter android:autoVerify="true"> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:host="appnamestage.page.link" android:scheme="https"/> <data android:host="appname.page.link" android:scheme="https"/> </intent-filter> </activity>
2. 移除MainActivity中残留的动态链接intent-filter
检查MainActivity的Manifest配置,确保已经删除所有和Firebase动态链接相关的<intent-filter>,避免系统优先匹配MainActivity。
3. 在WebViewActivity中处理动态链接Intent
重写onNewIntent方法,专门处理动态链接跳转回来的Intent,同时在onCreate中处理初始启动的Intent:
public class WebViewActivity extends AppCompatActivity { private WebView webView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_web_view); webView = findViewById(R.id.web_view); // 初始化WebView基础配置 initWebViewSettings(); // 处理页面启动时的初始Intent handleDynamicLinkIntent(getIntent()); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); // 处理动态链接跳转回来的新Intent handleDynamicLinkIntent(intent); // 更新当前Activity的Intent,避免后续重复处理 setIntent(intent); } private void initWebViewSettings() { WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true); settings.setDomStorageEnabled(true); // 根据业务需求添加其他WebView配置 } private void handleDynamicLinkIntent(Intent intent) { FirebaseDynamicLinks.getInstance() .getDynamicLink(intent) .addOnSuccessListener(pendingDynamicLinkData -> { Uri deepLink = null; if (pendingDynamicLinkData != null) { deepLink = pendingDynamicLinkData.getLink(); } // 这里根据动态链接内容做后续业务处理 // 比如OTP验证成功后,关闭WebViewActivity返回MainActivity if (deepLink != null) { finish(); // 如需给MainActivity传递数据,可使用startActivityForResult或EventBus等方式 } }) .addOnFailureListener(e -> { Log.e("WebViewActivity", "动态链接解析失败: " + e.getMessage()); }); } }
4. 验证Firebase控制台配置
登录Firebase控制台,检查你的动态链接配置,确保跳转目标的包名和Activity配置正确,没有指向MainActivity的规则。
原理说明
singleTask启动模式会让Activity在任务栈中保持唯一实例,当有新的Intent匹配时,系统会把后台的该Activity实例调到前台,并触发onNewIntent方法,而非创建新实例或启动其他Activity。- 主动处理动态链接的Intent,确保跳转回来的逻辑由WebViewActivity接管,而非让系统默认分发到MainActivity。
内容的提问来源于stack exchange,提问作者KnightCavalry
相关产品推荐
相关产品推荐

