关于overridePendingTransition()设置activity切换动画失效问题

摘要:

我们在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) 开始,应用程序只能在同一个任务中指定过渡动画。对于跨任务的过渡动画,系统将使用默认的动画。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值