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

OverridePendingTransition失效:重复打开已启动Activity时动画仅首次生效

解决重复启动栈顶Activity时入场动画失效的问题

嘿,这个坑我之前踩过!其实问题的根源很简单:当你要启动的Activity已经处于任务栈顶部时,系统不会重新创建新的实例,而是直接复用已有的实例并调用onNewIntent()方法,这时候默认的入场动画逻辑就不会被触发了——只有首次创建Activity实例时,系统才会自动执行入场动画。

下面给你几个实用的解决方案,你可以根据自己的场景选择:

方案1:启动时手动指定动画 + onNewIntent中补发动画

这是最通用的方案,不需要修改Activity的启动模式:

  1. 启动Activity时,添加FLAG_ACTIVITY_REORDER_TO_FRONT标志(确保将目标Activity移到栈顶),并立即调用overridePendingTransition指定动画:
Intent intent = new Intent(this, YourTargetActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);
// 这里指定入场和退场动画
overridePendingTransition(R.anim.slide_in_from_right, R.anim.slide_out_to_left);
  1. 在目标Activity的onNewIntent方法中,再次调用overridePendingTransition补发动画:
@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent); // 更新当前Intent
    // 手动触发入场动画
    overridePendingTransition(R.anim.slide_in_from_right, R.anim.slide_out_to_left);
}

方案2:修改Activity启动模式为singleTask(适合特定业务场景)

如果你的Activity本身就需要全局单例的特性,可以在AndroidManifest.xml中把它的启动模式设为singleTask:

<activity
    android:name=".YourTargetActivity"
    android:launchMode="singleTask" />

然后同样在onNewIntent方法中手动调用overridePendingTransition来触发动画,逻辑和方案1的第二步一致。

注意事项

  • overridePendingTransition必须在startActivity()或finish()方法调用之后立即执行,否则可能不会生效。
  • 动画资源文件要放在res/anim目录下,确保动画逻辑符合你的需求(比如slide_in_from_right是从右侧滑入的动画)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:58:36