摘要:
我们在Android开发中难免会遇到多个activity,此时为了给每个activity添加转场动画,往往都会采用overridePendingTransition()方式,但有的时候这个方法可能会失效,因此记录下,方便大家查看。
一、overridePendingTransition写的位置不对:
可得注意下,overridePendingTransition的位置不是随便写的
确保overridePendingTransition()方法写在startActivit()
之后,finish()
之后。
// 当前Activity中,启动targetActivity
Intent intent = new Intent(this, TargetActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.enter, R.anim.exit);
// targetActivity返回之前的Activity
@Override
public void finish() {
super.finish();
overridePendingTransition(R.anim.enter, R.anim.exit);
}
原因的话,跟踪这个overridePendingTransition的源码:
Activity#overridePendingTransition(…)
||
ActivityClient#overridePendingTransition(…)
||
IActivityClientController#overridePendingTransition(…)
|| – AIDL跨进程通信
ActivityClientController#overridePendingTransition(…)
||
AppTransition#overridePendingAppTransition(…)
void overridePendingAppTransition(String packageName, int enterAnim, int exitAnim,
@ColorInt int backgroundColor, IRemoteCallback startedCallback,
IRemoteCallback endedCallback, boolean overrideTaskTransaction) {
if (canOverridePendingAppTransition()) { // 判断是否覆盖过度动画
clear();
mNextAppTransitionOverrideRequested = true;
mNextAppTransitionPackage = packageName;
mNextAppTransitionEnter = enterAnim;
mNextAppTransitionExit = exitAnim;
mNextAppTransitionBackgroundColor = backgroundColor;
postAnimationCallback();
mNextAppTransitionCallback = startedCallback;
mAnimationFinishedCallback = endedCallback;
mOverrideTaskTransition = overrideTaskTransaction;
}
}
private boolean canOverridePendingAppTransition() {
// Remote animations always take precedence
return isTransitionSet() && mNextAppTransitionType != NEXT_TRANSIT_TYPE_REMOTE;
}
boolean isTransitionSet() {
return !mNextAppTransitionRequests.isEmpty();
}
如果我们没有在overridePendingTransition()之前调用startActivity等等,那么这个mNextAppTransitionRequests就是空的,因此就不会执行过度动画了。
二、Activity的启动模式:
这种情况是我在日常使用中发现的
例如:
<activity android:name=".target.TargetActivity"
android:launchMode="singleInstance"
android:exported="true"/>
一旦我们指定了,activity的启动模式是singleInstance,独立占用一个任务战,此时不管overridePendingTransition设置什么动画都会失效,并且通过设置Activity的主题的方式设置动画也一样失效。
chatGPT解释是:singleInstance的 Activity 具有独立的任务栈 (Task Stack),过渡动画的作用范围仅限于同一个任务栈内。
补充(2025-02-25):
当时没注意看overridePendingTransition中给的方法注释:
也就是从 Android 12 (Build.VERSION_CODES.S) 开始,应用程序只能在同一个任务中指定过渡动画。对于跨任务的过渡动画,系统将使用默认的动画。