You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android中finish()与supportFinishAfterTransition()的区别是什么?

嘿,这个问题问到点子上了!虽然你在普通跳转场景下没看出差异,但这俩方法的设计初衷和适用场景其实有明显区别,我给你拆解清楚:

核心差异详解

1. 动画适配的侧重点不同

  • finish():这是Android原生最基础的Activity销毁方法,它只认系统默认的返回过渡动画(或者你在Manifest里给Activity配置的固定动画),完全不兼容Android 5.0(API 21)引入的**共享元素过渡(Shared Element Transition)**反向动画。
  • supportFinishAfterTransition():这是AppCompat库专为共享元素过渡场景打造的方法。当你从Activity A跳转到Activity B时使用了共享元素(比如共享一张图片、一个标题文本),调用这个方法会触发反向共享元素过渡动画,让共享元素平滑地从Activity B回归到Activity A的原始位置,等动画完成后再销毁Activity B。

2. 执行逻辑的本质区别

  • 调用finish()时,系统会直接标记当前Activity为待销毁状态,紧接着执行返回动画,全程不会检查是否有共享元素过渡的状态。
  • 调用supportFinishAfterTransition()时,系统会先做一步判断:
    • 如果当前Activity开启了共享元素过渡,它会先等待反向过渡动画执行完毕,再销毁Activity;
    • 如果没有启用任何共享元素过渡,它就会降级成finish()的行为——这就是你测试时俩方法表现一致的原因!你的场景里没用到共享元素,所以它们的效果完全重合。

3. 适用场景建议

  • 普通的Activity跳转(没有共享元素动画需求):用finish()就够了,更轻量化,没必要用专门的过渡适配方法。
  • 实现了共享元素过渡的场景(比如列表页点击图片跳转到详情页,图片需要平滑放大/缩小):必须用supportFinishAfterTransition(),否则返回时共享元素会直接消失,动画效果会非常突兀,破坏用户体验。

举个直观的例子:假设你在Activity1里有一张商品图,跳转Activity2时用ActivityOptions.makeSceneTransitionAnimation()把这张图设为共享元素。此时在Activity2按返回键,用supportFinishAfterTransition()会让商品图平滑缩回到Activity1的位置;但如果用finish(),Activity2会直接关闭,商品图没有过渡动画,体验大打折扣。

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

火山引擎 最新活动