【问题标题】:Is it a good idea to call finish() after starting a new Activity in Android?在 Android 中启动新 Activity 后调用 finish() 是个好主意吗?
【发布时间】:2013-08-09 07:02:37
【问题描述】:

喜欢:

startActivity(intent);
finish();

不调用finish() explicitly, onDestroy()是不调用前一个Activity,我的内存用完了(OutOfMemory Exception).

那么,打电话给finish() explicitly to prevent OutOfMemory Exception?是个好主意

【问题讨论】:

  • 如果用户想通过点击返回按钮返回到之前的活动怎么办?
  • 没有。您的问题出在其他地方。
  • 您是否在任何地方使用Bitmap(或集合)?如果您还没有使用过mat Memory Analyzer Tool,那么现在是个好时机。
  • 当你调用 finish() 时,你基本上是从 backstack 中删除活动,所以如果你移动到另一个活动并决定通过 backpress 回来,它会崩溃,因为活动不再存在于后台堆栈中以便它被调用,这是返回到活动的唯一方法,即使通过创建意图将其从后台堆栈中删除,如此简单地创建该活动的新实例

标签: android android-intent out-of-memory activity-finish


【解决方案1】:

如果您不需要该Activity 的实例,这样做很好。因此,当您按回下一个 Activity 时,请知道您不会再回到这个,而是在堆栈下方的 Activity 所在的位置或主屏幕上(如果没有更多)。

但是,我不确定这就是您收到OOM 异常的原因,您可能应该弄清楚它是从哪里来的。如果您使用的是Bitmaps,那么这可能会导致异常。

【讨论】:

  • 是的,我使用位图。如果不显式调用finish(),GC就不会调用Activity的onDestroy(),Activity加载的Bitmap资源会占用很大的内存,所以最终出现outOfMemoryException。如果 GC 未调用 onDestroy() 是否意味着内存泄漏?如果没有对Activity的引用,GC不应该在需要更多内存的时候调用ondestroy()吗?
【解决方案2】:

当您启动一个新活动时,当前活动被推入当前任务的后栈。 (您可以通过标志和/或清单更改此行为,但这是默认行为。)当用户按下后退功能时,顶部活动完成并弹出堆栈。结果是用户看到应用返回到上一个活动。

在开始一项新活动后拨打finish() 完全没问题。结果将是当前活动(不再位于堆栈顶部,因为您刚刚开始了一个新活动)将从堆栈中删除。然后当用户按下 Back 时,它会转到 back stack 上的上一个活动(如果堆栈为空,则退出您的应用程序)。

如果您总是在活动 A 和 B 之间来回跳动,总是启动一个新的并且从不调用 finish(),这可能会导致 OOM 异常,因为堆栈会填满每个活动的实例。

您可以在指南主题Tasks and Back Stack 中阅读更多相关信息。它还描述了如何正确处理活动之间的循环。

【讨论】:

  • 很好的答案。谢谢。
  • startActivity(intent); finish(); 这两个语句的顺序有关系吗?
  • @WeishiZeng - 我已经做到了两种方式,似乎没有什么区别。我认为这不重要。
  • @TedHopp 谢谢!我也看到两者都在工作。但只是好奇,finish() 是否有可能在startActivity(intent) 发生之前导致当前活动实例的破坏?那么问题就来了,因为intentstartActivity() 在没有关联实例的情况下都不会存在。
  • @WeishiZeng - 我不认为有问题。 Activity 可能会被销毁(尽管这可能发生在 UI 循环的后续传递中),但 Activity 对象实例仍然存在。
【解决方案3】:

或者,您可以在清单中将 android:noHistory="true" 添加到活动中,当您离开活动时,它不会将其添加到后台堆栈。

【讨论】:

    猜你喜欢
    • 2011-02-12
    • 1970-01-01
    • 2016-08-05
    • 2023-03-26
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    相关资源
    最近更新 更多