【问题标题】:How to stop transition animation on clear activity stack android?如何在清除活动堆栈android上停止过渡动画?
【发布时间】:2020-01-14 13:03:50
【问题描述】:

当我简单地从登录活动转到主活动时,白色屏幕会闪烁几毫秒,并使用以下清晰的返回堆栈代码。

Intent intent = new Intent(LoginActivity.this, HomeActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
overridePendingTransition(0, 0);

如果我只是让 startActivity 没有标志(或者说没有明确的 backstack)

overridePendingTransition(0, 0);

白屏不闪烁。

但我必须清除回栈并开始一个没有过渡动画的新活动。所以它不会在几毫秒内闪烁/出现在白屏中。

期待尽快得到完美答案。干杯!

【问题讨论】:

    标签: java android performance android-studio android-intent


    【解决方案1】:

    正如我在问题中提到的那样,不使用标志的 startActivity 不会闪烁并显示白屏。

    所以我选择了那个。

    现在的问题是当我进入主活动时清除第一个登录活动的堆栈。

    我通过使用 setter 和 getter 方法将 Login 活动的上下文设置到 Application 类来解决它。

    每当您到达主要活动时。它会通过getter方法检查你是否有Application类的上下文。

    如果是,并且是登录活动,则创建 context.finish,这将通过从主活动中删除登录活动来清除后台堆栈。并在Application类中给setter设置null值。

    如有任何疑问,请随时分享。谢谢。

    【讨论】:

    • 听起来你是在故意设置内存泄漏。我强烈建议寻找不同的解决方案。您是否尝试过仅使用FLAG_ACTIVITY_CLEAR_TASK 而省略FLAG_ACTIVITY_NEW_TASK?这个问题完全可以用正确的标志来解决,只是哪个标志的问题。
    • 您还应该考虑到意图标志可能正在正常工作,而闪烁实际上可能是某种症状:例如,在主线程上执行长时间操作。使用 Intent.FLAG_ACTIVITY_NEW_TASK | 非常常见。 Intent.FLAG_ACTIVITY_CLEAR_TASK 和大多数人没有看到这个问题。所以它指出了可能略有不同的东西。
    • 首先不要在清单中设置活动上下文。这是潜在的内存泄漏。
    • @BrianYencho 我不确定为什么如果我在下一个活动中删除活动上下文会泄漏内存
    • 因为您假设这将始终有效并且始终是相同的参考。可能存在涉及轮换和其他配置更改的情况,其中 Activity 引用与堆栈中当前的引用不同。或者进程死亡存在潜在问题,其中该引用被清除,因此无法调用“完成”。出于多种原因,以这种方式保存 Activity 引用是不安全的。
    【解决方案2】:

    不要使用Intent.FLAG_ACTIVITY_NEW_TASK。如果你想清除 backstack(假设你的登录 Activity 是堆栈中唯一的一个),只需 finish 当前 Activity:

    Intent intent = new Intent(LoginActivity.this, HomeActivity.class);
    startActivity(intent);
    overridePendingTransition(0, 0);
    finish();
    

    Intent.FLAG_ACTIVITY_NEW_TASK 可能是闪存的原因,因为它需要您创建一个全新的“任务”(这是具有给定历史的活动的集合),而不仅仅是重用当前的。那时几乎就像导航到另一个应用程序一样。

    【讨论】:

    • 我理解为什么会发生这种情况/行为,但无论如何都得到了解决。 bdw 有两个登录/安全屏幕。这样我就可以完成第二个调用活动了。但是第一个登录屏幕会在堆栈中。
    • 啊,明白了。好吧,如果您自己解决了这个问题,您应该更新您的问题或发布您自己的解决方案并接受它。
    【解决方案3】:

    尝试在清单中为登录活动设置noHistory="true",并在没有任何标志的情况下启动HomeActivity。这应该可以解决您的问题。

    【讨论】:

    • 由于某种原因,我无法让 nohistory=true 登录。得另辟蹊径。
    猜你喜欢
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    相关资源
    最近更新 更多