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

如何让Android Deeplink每次打开MainActivity?解析launchMode差异

问题背景

在AndroidManifest中注册了响应Deeplink的MainActivity,配置如下:

<activity
    android:name=".MainActivity"
    android:label="@string/app_name"
    android:launchMode="singleTop"
    android:exported="true"
    android:theme="@style/Theme.TestDeeplink">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />

        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />

        <data android:scheme="testdeeplink" />
    </intent-filter>
</activity>

同时存在DashboardActivity,用户从MainActivity点击按钮可跳转至该页面:

<activity
    android:name=".DashboardActivity"
    android:label="DashboardActivity"
    android:theme="@style/Theme.TestDeeplink"/>

通过adb命令测试Deeplink:
首次调用:

adb shell am start -d testdeeplink://test
Starting: Intent { dat=testdeeplink://test }

第二次调用(此时已跳转到DashboardActivity):

adb shell am start -d testdeeplink://test
Starting: Intent { dat=testdeeplink://test }
Warning: Activity not started, intent has been delivered to currently running top-most instance.

测试现象:

  • 当应用停留在MainActivity时,调用Deeplink会触发onNewIntent方法,正常接收Intent
  • 当应用跳转到DashboardActivity后,调用Deeplink不会触发onNewIntent,也不会打开MainActivity

解决方案

将MainActivity的launchMode从singleTop修改为singleTask或singleInstance后,即可实现每次调用Deeplink都强制打开MainActivity。

LaunchMode 详细差异解析

1. standard(默认模式)

  • 每次启动Activity都会创建新实例,无论栈中是否已有该Activity的实例
  • 新实例被压入当前任务栈顶部
  • 适用于无特殊跳转逻辑的普通页面

2. singleTop

  • 若目标Activity已在当前任务栈顶部,则不创建新实例,直接调用该实例的onNewIntent方法
  • 若目标Activity不在栈顶,仍会创建新实例压入栈顶
  • 你的问题根源在此:当DashboardActivity在栈顶时,MainActivity不在栈顶,Deeplink的Intent只会传递给当前栈顶的DashboardActivity,但该页面未配置对应IntentFilter也未处理该Intent,导致onNewIntent不触发,MainActivity也无法唤起

3. singleTask

  • 系统会检查当前任务栈中是否存在该Activity的实例:
    • 若存在,会将该实例之上的所有Activity弹出栈,让该实例回到栈顶,同时调用其onNewIntent方法
    • 若不存在,则创建新实例压入栈顶
  • 该Activity会作为任务栈的根Activity(未指定任务栈时使用默认栈)
  • 适合作为应用入口或需要唯一实例、同时清理上层页面的场景,比如你的Deeplink入口MainActivity

4. singleInstance

  • 逻辑与singleTask类似,但该Activity会独占一个全新的任务栈
  • 整个系统中只会存在该Activity的一个实例
  • 适用于完全独立于其他页面的场景(如系统拨号、设置页面),普通应用开发中较少使用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 06:23:11