2013-03-25 37 views
3

我有一个示例应用程序,其中一个Activity。我希望用户能够使用后退按钮离开应用程序,然后通过应用程序图标租用,而无需创建Activity的新实例。如何使用后退按钮防止活动的多个实例?

问题是,如果我按下后退按钮并承载n次,那么我最终会得到n个应用程序实例(如在内存分析工具中所观察到的)。

我试过覆盖onBackPressed()致电finish()。在这种情况下,我可以看到onDestroy()被调用,但它仍然在内存中留下了多个Activity实例。我也尝试了不同的android:launchMode,其中包括"singleTop","singleTask""singleInstance",但在所有情况下仍存在多个Activity类的实例。

如何防止在这种简单情况下运行Activity的多个实例?

+0

默认情况下,它应该以您想要的方式工作,除非Android需要回收您的应用正在使用的资源。您应该阅读应用程序生命周期。 – 2013-03-25 15:38:03

+0

啊,你的回答慢慢地回忆起我的一个测试设备有一个不寻常的内存管理方案。特别是,三星S3似乎有某种延迟gc,因此,即使在其他设备更积极地释放内存之后,MAT仍显示内存引用(请参阅前面的问题[此处](http://stackoverflow.com/questions/) 14445224 /调用精加工 - 不 - 不明确的内存引用到活动))。我重新测试了Galaxy Nexus,它的表现如预期 - 所以我认为这是一场虚惊!无论如何,感谢您的回复。 – gcl1 2013-03-25 15:46:15

回答

0

当您点击后退按钮时,您的活动被破坏。活动每次重点都会重新创建是很自然的事。这是它的工作原理。

当屏幕方向更改时,活动也会被销毁并重新创建。

http://developer.android.com/training/basics/activity-lifecycle/index.html。遍历活动生命周期。

http://developer.android.com/guide/components/tasks-and-back-stack.html.The文档为您提供了一个想法,即当用户单击后退按钮和主页按钮时,活动如何从后退堆栈推出并弹出。

假设你开始一个新的活动,它被推到后面的堆栈,它需要重点。

当当前活动开始另一个活动时,新活动被推到堆栈的顶部并获得焦点。先前的活动保留在堆栈中,但已停止。

当你点击返回按钮时,当前活动从栈中弹出并被销毁。 因此,后堆栈中的前一个活动需要关注。

注意:多个任务可以一次在背景中进行。但是,如果用户同时运行多个后台任务,系统可能会开始销毁后台活动以恢复内存,从而导致活动状态丢失。请参阅以下关于活动状态的部分。

+0

我的问题是为什么MAT显示一个活动在内存中的活动,即使在调用onDestroy()之后?但是,正如我在上面的评论中解释的那样,它看起来像是一个特定于特定设备的虚警。不管怎么说,还是要谢谢你。 – gcl1 2013-03-25 15:49:44

相关问题