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

Android开发中如何判断当前Activity是否由特定Activity跳转而来

Android 校验Activity跳转来源的实现方案

启动新Activity时完全可以校验跳转来源,针对A/B/C三个页面互跳、判断C是否从B跳转的场景,有以下几种可落地的实现方案,按推荐优先级排序:

方案1:Intent自定义传参标记(最推荐)

这是兼容性最好、逻辑最可控的通用方案,不受系统版本、ROM定制逻辑影响,是生产环境的首选方案。

  • 跳转时在来源页给Intent附加自定义标记参数,建议把标记值定义为常量避免硬编码:
// B页面跳转C的代码
val intent = Intent(this, C::class.java)
intent.putExtra("EXTRA_JUMP_FROM", "ACTIVITY_B")
startActivity(intent)

// A页面跳转C的代码
val intent = Intent(this, C::class.java)
intent.putExtra("EXTRA_JUMP_FROM", "ACTIVITY_A")
startActivity(intent)
  • 在C页面的onCreate方法中读取参数判断即可,如果C的启动模式配置为复用栈内实例,需要在onNewIntent回调中同步处理:
val fromTag = intent.getStringExtra("EXTRA_JUMP_FROM")
if (fromTag == "ACTIVITY_B") {
    // 确认是从B页面跳转而来,执行对应业务逻辑
}

注意:如果C存在其他入口(比如通知点击、深链、第三方应用跳转),记得给来源标记设置默认兜底值,避免空指针或逻辑判断异常。

方案2:调用系统API直接获取Referrer(适合无侵入场景)

Android 5.1(API 22)及以上版本提供了getReferrer()方法,可以直接获取发起跳转的来源信息,不需要提前在Intent里传参:

// 在C页面中调用
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
    val referrerUri = referrer
    // 自行替换成B页面的完整类名
    val isFromB = referrerUri?.toString()?.contains("com.yourpackage.B") == true
    if (isFromB) {
        // 来源为B页面
    }
}

这个方案的局限性很明显:有版本门槛,部分深度定制的ROM可能篡改referrer返回值,跨应用跳转时返回的是来源应用包名而非Activity类名,仅适合不需要兼容低版本、逻辑简单的场景。

不推荐的方案

不要尝试通过读取任务栈列表获取上一个Activity实例的方式判断来源,不同Android版本的任务栈管理规则差异极大,部分场景下系统会回收栈内非顶层Activity,很容易拿到null或者错误的实例,线上稳定性差。


内容的提问来源于stack exchange,提问作者Kelven Lim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 14:18:28