按下主屏幕按钮时Activity被销毁

13

在我的应用程序中,当我按下主屏幕按钮时,该活动会调用onDestroy()方法。 按理说应该只调用onPause()方法,对吧?

为什么会发生这种情况呢?


你能添加一些代码吗?如果你明确地命令了 onPause(甚至 onDestroy),那么你的问题很可能来自这个区域。使用搜索功能。 - The Obscure Question
2
您的活动中的nohistory属性是否为true?如果是,则将调用activity finish。 - nandeesh
android:noHistory 默认值为 false - jordanpg
1
@breceivemail 你救了我的命! - Stav Bodik
@nandeesh,非常感谢你救了我的命。但是我认为noHistory="true"并不会调用finish()。我在onPauseonStop中打印了isFinishing,但两者均显示为false。我检查有误吗? - starriet
6个回答

15

同时请检查您在清单文件中的Activity是否使用了android:noHistory标记

文档: android:noHistory 该属性决定当用户离开并不再显示该Activity时,该Activity是否应该从Activity堆栈中移除并且调用其finish()方法以结束它。


你说得完全正确,但我有一个小问题:我认为 noHistory="true" 不会调用 finish()。我在 onPauseonStop 中打印了 isFinishing,但两者都显示为 falsefinish() 没有被调用吗? - starriet

12

这取决于您的手机有多少内存,如果您的手机内存不足,那么它将立即销毁该活动以释放资源。在新手机上,这种情况不会发生,因为它们有足够的备用内存。


6
如果系统受限并确定需要释放一些资源,按下主页按钮时可能会销毁您的活动。文档指出,如果以下情况之一发生,则可以调用onDestroy()

这可能是因为活动正在结束(有人在其上调用了finish()),或者因为系统暂时销毁此活动实例以节省空间。您可以使用isFinishing()方法区分这两种情况。

此外,请注意,在调用onStop()后,系统可以在不调用onDestroy()的情况下“杀死”您的程序。因此,任何清理/数据持久化代码都应位于onPause()onStop()中。

1

好的,这取决于很多因素。如果您在Android 3.2+设备上遇到此问题,则应将screenSize属性添加到android:configChanges中。

    android:configChanges="keyboardHidden|orientation|screenSize"

此外,还需在您的启动活动中添加 android:launchMode="singleTop"。请注意,您需要使用 Android SDK 15 或更高版本作为目标,但您的应用程序也将在较旧的设备上运行。希望这可以帮助您。

1
另外需要检查的一点是,在onPause()时,您的活动是否调用了finish()

1
当然可能是内存问题,但在此之前请检查清单文件中的活动声明,如果您已经声明了“无历史记录”(您不希望该活动保留在活动堆栈中),则可以避免该问题。您还可以在使用意图创建活动时使用一些标志。因此,最有可能的答案是Alex Contour给出的答案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接