0

我试图寻找一个明确的答案,但找不到,所以在这里问。抱歉,如果这是一个 noOOb 问题。

我的问题是 Android 是否缓存活动范围之外的视图膨胀?

我写了一个示例应用程序,其中有 2 个活动

活动 A 活动 B

A只有一个启动B的按钮。B的布局相当复杂。

B 有一个视图存根,我计时了 ViewStub 膨胀(基本上呈现整个布局)。

当我计算 B 的布局膨胀需要多少时间时。第一次大约花了 100 毫秒。进一步的膨胀需要 15-20 毫秒。奇怪的部分是经过几次迭代后,随机 B 再次需要 100 多毫秒才能膨胀。

我还验证了我的复杂活动 (B) 正在被破坏并再次创建(当我从 B 回击并从 A 再次启动 B 时)

我在 Android 代码库中找不到任何可以解释为什么会发生这种情况的东西。

有人可以告诉我这个缓存发生在哪里。

以下是 ComplexActivity onCreate 和 onDestroy 的日志。我正在使用后按来破坏活动

04-30 13:32:09.879: I/testInflation(19298): onCreate setting up content view
04-30 13:32:09.895: I/testInflation(19298): onCreate content view set. Time took = 15 ms.
04-30 13:32:09.895: I/testInflation(19298): onCreate inflating ui
04-30 13:32:10.004: I/testInflation(19298): onCreate ui inflated. Time took = 108 ms. Total time into method = 123 ms.
04-30 13:32:12.450: I/testInflation(19298): activity destroyed
04-30 13:32:12.903: I/testInflation(19298): onCreate setting up content view
04-30 13:32:12.911: I/testInflation(19298): onCreate content view set. Time took = 13 ms.
04-30 13:32:12.911: I/testInflation(19298): onCreate inflating ui
04-30 13:32:12.926: I/testInflation(19298): onCreate ui inflated. Time took = 13 ms. Total time into method = 26 ms.
04-30 13:32:13.958: I/testInflation(19298): activity destroyed
04-30 13:32:14.379: I/testInflation(19298): onCreate setting up content view
04-30 13:32:14.395: I/testInflation(19298): onCreate content view set. Time took = 11 ms.
04-30 13:32:14.395: I/testInflation(19298): onCreate inflating ui
04-30 13:32:14.403: I/testInflation(19298): onCreate ui inflated. Time took = 11 ms. Total time into method = 22 ms.
04-30 13:32:15.223: I/testInflation(19298): activity destroyed
04-30 13:32:15.622: I/testInflation(19298): onCreate setting up content view
04-30 13:32:15.637: I/testInflation(19298): onCreate content view set. Time took = 11 ms.
04-30 13:32:15.637: I/testInflation(19298): onCreate inflating ui
04-30 13:32:15.645: I/testInflation(19298): onCreate ui inflated. Time took = 13 ms. Total time into method = 24 ms.
04-30 13:32:16.692: I/testInflation(19298): activity destroyed
04-30 13:32:17.934: I/testInflation(19298): onCreate setting up content view
04-30 13:32:17.950: I/testInflation(19298): onCreate content view set. Time took = 11 ms.
04-30 13:32:17.950: I/testInflation(19298): onCreate inflating ui
04-30 13:32:17.965: I/testInflation(19298): onCreate ui inflated. Time took = 18 ms. Total time into method = 30 ms.
04-30 13:32:19.020: I/testInflation(19298): activity destroyed
04-30 13:32:23.825: I/testInflation(19298): onCreate setting up content view
04-30 13:32:23.833: I/testInflation(19298): onCreate content view set. Time took = 12 ms.
04-30 13:32:23.833: I/testInflation(19298): onCreate inflating ui
04-30 13:32:23.848: I/testInflation(19298): onCreate ui inflated. Time took = 11 ms. Total time into method = 23 ms.
04-30 13:32:26.622: I/testInflation(19298): activity destroyed
04-30 13:32:27.145: I/testInflation(19298): onCreate setting up content view
04-30 13:32:27.161: I/testInflation(19298): onCreate content view set. Time took = 15 ms.
04-30 13:32:27.161: I/testInflation(19298): onCreate inflating ui
04-30 13:32:27.231: I/testInflation(19298): onCreate ui inflated. Time took = 69 ms. Total time into method = 85 ms.
04-30 13:32:28.200: I/testInflation(19298): activity destroyed
04-30 13:32:28.645: I/testInflation(19298): onCreate setting up content view
04-30 13:32:28.661: I/testInflation(19298): onCreate content view set. Time took = 11 ms.
04-30 13:32:28.661: I/testInflation(19298): onCreate inflating ui
04-30 13:32:28.747: I/testInflation(19298): onCreate ui inflated. Time took = 91 ms. Total time into method = 102 ms.
4

1 回答 1

0

android:launchMode 关于如何启动 Activity 的说明。有四种模式与 Intent 对象中的活动标志(FLAG_ACTIVITY_* 常量)一起工作,以确定当调用活动来处理意图时应该发生什么。他们是:

“标准”

“单顶”

“单任务”

“单一实例”

默认模式是“标准”。

一边是“标准”和“singleTop”活动,另一边是“singleTask”和“singleInstance”活动。可以多次实例化具有“标准”或“单顶”启动模式的活动。实例可以属于任何任务,并且可以位于活动堆栈中的任何位置。通常,它们被启动到调用 startActivity() 的任务中(除非 Intent 对象包含 FLAG_ACTIVITY_NEW_TASK 指令,在这种情况下选择不同的任务 - 请参阅 taskAffinity 属性)。

相反,“singleTask”和“singleInstance”活动只能开始一个任务。它们始终位于活动堆栈的根部。此外,设备一次只能保存一个活动实例——只有一个这样的任务。

所以默认情况下它是标准的,而不是使用 backstack 中的活动。阅读有关 android 活动堆栈的信息。当活动来自后堆栈和所有时。您再次启动活动所需的时间更少,因为它在堆中有很多对象

根据此文档,当从堆栈中弹出活动时......它将被销毁。http://developer.android.com/guide/components/tasks-and-back-stack.html

但是当你启动它时,你的活动需要不同的时间。那是因为系统的垃圾收集器在某个时间段运行并清除分配给对象的内存。因此,在启动 Activity A 之后,您将进入 Activity B。现在您正在按下返回按钮:-这意味着 Activity B 将弹出堆栈并将很快被销毁。但是您正在垃圾收集器运行之前启动该活动。这就是为什么它需要更少的时间

做一件事,在销毁时运行 System.gc() ....或在 onPause() 中写入finish() ...您的活动将花费几乎相同的时间来膨胀布局。

于 2013-04-30T20:50:06.020 回答