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

API 35版本中Activity切换动画机制变更问题及原效果恢复方案咨询

API 35版本中Activity切换动画机制变更问题及原效果恢复方案咨询

Hey 👋,这个问题我之前在适配Android 14和15预览版的时候也碰到过!确实是系统在API 34(Android 14)开始做了底层变更,到API 35(Android 15预览版)进一步强化了,核心原因是谷歌为了优化后台Activity的内存占用,默认会在Activity切换到后台不可见时,暂停它的绘制逻辑甚至释放掉渲染缓存——这就导致你执行返回动画时,原本应该在下方的前一个Activity已经没有可显示的绘制缓存了,所以动画过程中只能显示窗口的默认黑色背景,等动画结束后系统才会重新绘制前一个Activity的内容,就出现了“突然弹出”的效果。

恢复原效果的可行方案

  • 先修正返回动画的调用逻辑
    看你贴的返回代码,是通过origin(前一个Activity)实例来启动新Activity然后执行finish,这个逻辑其实存在问题。正确的做法是在当前要关闭的Activity里直接操作:

    // 在你要关闭的目标Activity中调用
    finish();
    overridePendingTransition(0, R.anim.slide_out_right);
    

    这样系统能正确识别前后Activity的层级关系,避免跨实例操作导致的生命周期异常,大部分情况下这个调整就能解决问题。

  • 强制保留前一个Activity的绘制缓存
    如果修正调用逻辑后仍有异常,你可以在返回后要显示的那个ActivityonCreate方法中添加窗口参数,让系统在它不可见时保留绘制缓存:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 强制保留绘制缓存,防止后台时被系统清理
        getWindow().setFlags(
            WindowManager.LayoutParams.FLAG_RETAIN_DRAWING_CACHE,
            WindowManager.LayoutParams.FLAG_RETAIN_DRAWING_CACHE
        );
        setContentView(R.layout.your_activity_layout);
        // 你的其他初始化代码
    }
    

    注意这个操作会增加一定的内存占用,因为要保留Activity的完整绘制缓存。如果你的Activity内容复杂,建议在该Activity彻底退出时清除这个标记,平衡性能与视觉效果。

  • 备选方案:改用View层级过渡动画
    如果你不想因为保留缓存影响性能,也可以把动画逻辑移到View层级。比如在新Activity的根布局上添加进入动画,返回时给根布局添加退出动画,直接控制View的显示/隐藏逻辑,不受系统Activity窗口层级变更的影响,也能实现和原效果一致的视觉体验。

补充说明

这个内存优化的变更从Android 14(API 34)开始引入,API 35进一步强化了后台资源回收策略,才让这个视觉差异变得更明显。你可以先尝试第一个方案,大部分场景下就能恢复你想要的“旧Activity滑出时,前一个Activity内容始终在下方可见”的效果。

内容来源于stack exchange

火山引擎 最新活动