【问题标题】:How to prevent multiple instances of an Activity, with back button?如何使用后退按钮防止 Activity 的多个实例?
【发布时间】:2013-03-25 15:33:03
【问题描述】:

我有一个带有Activity 的示例应用程序。我希望用户能够使用后退按钮离开应用程序,稍后通过应用程序的图标进行租用,而无需创建 Activity 的新实例。

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

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

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

【问题讨论】:

  • 默认情况下它应该按照你想要的方式工作,除非 Android 需要回收你的应用正在使用的资源。您应该阅读应用程序生命周期。
  • 啊,你的回答让我记忆犹新,我的一个测试设备有一个不寻常的内存管理方案。具体来说,三星 S3 似乎有某种延迟 gc,因此,即使在其他设备更积极地释放内存之后,MAT 也会显示内存引用(参见之前的问题 here)。我用 Galaxy Nexus 重新测试,它的行为符合预期 - 所以我认为这是一个误报!无论如何,谢谢您的回复。

标签: android android-activity


【解决方案1】:

当您单击返回按钮时,您的活动将被破坏。每次获得焦点时都会重新创建活动,这是很自然的。这就是它的工作原理。

当屏幕方向改变时,Activity 也会被销毁并重新创建。

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

http://developer.android.com/guide/components/tasks-and-back-stack.html.The 文档让您了解当用户单击返回按钮和主页按钮时如何从返回堆栈推送和弹出活动。

假设你开始一个新的活动,它被推到后台堆栈并获得焦点。

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

当您单击返回按钮时,当前活动将从堆栈中弹出并被销毁。 所以后台堆栈中的前一个活动获得焦点。

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

【讨论】:

  • 我的问题是,为什么 MAT 会在内存中显示活动活动,即使在调用 onDestroy() 之后也是如此?但是,正如我在上面的评论中所解释的那样,这似乎是针对特定设备的误报。还是谢谢。
猜你喜欢
  • 1970-01-01
  • 2010-09-08
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多