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




