在不创建新实例的情况下移动类

时间:2011-04-22 18:36:53

标签: android memory-management memory-leaks class-design

有没有人知道在不创建新实例的情况下显示另一个类的方法? 从内存管理的角度来看,每次要显示不同的表单/页面时都需要使用StartActivity,然后创建类的新实例,而不是重用以前创建的实例,这似乎有点疯狂。

提前致谢

我想从已经说过的话 - 没有真正的方法可以做到这一点,这不会妨碍操作系统的“后退”功能? 我正在建立一个线性的应用程序,除了在每个屏幕上它有一个主页按钮,然后可以反击这个功能并以循环结束 - 无论如何你知道要销毁所有视图并重置回主要类? (IE防止内存泄漏成为问题,但也不会损坏操作系统功能)

在不重新启动应用程序的情况下将其视为“清晰历史记录”

2 个答案:

答案 0 :(得分:1)

不确定这是否适用于Android(来自MS / C#背景),但从概念上讲,一个选项是迭代打开表单,寻找具有特定句柄的表单。然后,一旦找到它,只需调用方法来显示该表单。这取决于是否存在与.NET中的Application.OpenForms属性等效的Java。

答案 1 :(得分:0)

  

这似乎从来看,每次要显示一个不同的形式/页,你需要使用StartActivity然后创建该类的不是重用先前创建的实例的新实例存储管理点有点疯狂。

从战术,欢迎添加FLAG_REORDER_TO_FRONT,使现有的活动返回到前台,所以只要你理解从导航观点来看的后果。

但是,你的问题很奇怪。你是如何访问StackOverflow的?

显然,它不是通过Web浏览器。 Web浏览器使用您认为“疯狂”的确切机制,即使之前已查看过该Web页面也会呈现Web页面。他们已经这样做了超过15年,我们一直都做得很好。

Android导航模型的设计大致反映了Web的模式:

  • 用户点击要继续前进的内容
  • 用户点击“返回”按钮移动到他们正在查看的上一个内容
  • 当用户想要切换到其他主要内容时,点击HOME按钮

通过“重用先前创建的实例”,您将绕过该导航模型。例如,假设您的活动堆栈是A-B-C-D,并且您使用startActivity()为B和Intent调用FLAG_REORDER_TO_FRONT。现在,活动堆栈是A-C-D-B。当用户按下BACK时间时,他们不再在他们原来看的B上,而是回到A.在浏览器中,这将是一种相当奇怪的行为。

Intent上有其他标志,或清单中<activity>上的属性,提供“重用以前创建的实例”。但是,它们并非“从内存管理的角度来看”。他们在那里传统的Web BACK-heavy导航模式不适合您的需求。

假设你没有在任何地方搞砸,Android会破坏未充分利用的活动,垃圾收集内存,甚至将内存返回给操作系统。