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
相关产品推荐
相关产品推荐

