2013-04-30 61 views
0

我试图寻找一个明确的答案,但无法找到它,所以问它在这里。道歉,如果这是一个问题。查看通胀缓存在活动

我的问题是Android是否将视野膨胀超出了活动的范围?

我写,其中有2个活动

活动A 活动B

甲只是有一个按钮,启动B. B具有相当复杂的布局的示例应用程序。

B有一个视图存根,我定时viewView的通货膨胀(基本上呈现整个布局)。

当我计算B的布局膨胀需要多少时间。第一次它花了大约100ms。进一步通货膨胀花了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. 
+0

@Robert感谢您修复logcat输出。 – ReadyToLearn 2013-04-30 20:44:27

+0

当您按下后,Android不会中止您的活动,它会一直保留在内存中,直到系统内存不足,然后才会删除活动。如果你有一个Android4 +设备,有一种方法可以强制杀死活动人员,如果你有一个Android4 +设备, 去设置 - >开发人员选项 - >不要保留活动,并确保选中 – 2013-04-30 20:45:16

+0

@jucas即使是我检查了Activity的onDestroy是否被调用? – ReadyToLearn 2013-04-30 20:46:29

回答

0

安卓launchMode 上的活动应该如何启动的指令。有四种模式与Intent对象中的活动标志(FLAG_ACTIVITY_ *常量)一起工作,以确定在调用活动来处理意图时应该发生什么。它们是:

“标准”

“singleTop”

“singleTask”

“singleInstance”

默认模式为 “标准”。

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

相比之下,“singleTask”和“singleInstance”活动只能开始一项任务。它们始终处于活动堆栈的根部。而且,该设备一次只能保存一个活动实例 - 只有一个这样的任务。

因此默认情况下它是标准的,比使用backstack中的活动更为标准。阅读关于android Activity堆栈。并且当活动从后面堆栈和所有时。 当你再次发起活动时,它会花更少的时间,因为它有很多堆中的对象

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

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

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

+0

摧毁后活动不会消失。在这一点上没有回退。 A-> B - >(后退,导致摧毁并将B扔掉) - > A – ReadyToLearn 2013-04-30 21:04:55

+0

我打印了这个活动的“this”指针,并且每当我再次发起活动时它总是给我新的活动。 – ReadyToLearn 2013-04-30 23:51:23

+0

其实事情是,当你从活动A开始B活动时,它将开始活动B,活动A将在后台。 在这种情况下,如果您按下后退按钮而不是活动B将被销毁,并且堆栈的前一活动(即活动A)将出现在前面。 这一次它将调用活动A的onRestart()方法。 – 2013-05-01 15:51:24