Android使用onBackPressed()避免onDestroy()

时间:2012-08-10 16:10:18

标签: android-activity

我正在尝试做一些应该非常简单的事情。

我有一款游戏,可以通过提供各种选项的屏幕启动StartActivity,其中一个是“开始游戏”。

当用户选择此选项时,游戏本身将使用类似于以下的代码启动:

Intent i = new Intent();
i.setClass(context, GameActivity.class);
context.startActivity(i);

一切正常。当在游戏中按下“后退”按钮时,控制权返回到此StartActivity。再次,这很好。

但是,按“后退”会导致调用“onDestroy()”(根据文档) - 这意味着当再次按下“开始游戏”时,GameActivity将从头开始。

我想要的是当按下“后退”时将GameActivity保留在内存中,以便按下“开始游戏”返回到它停止的位置。

这几乎是每个游戏都有的,所以必须非常简单,但我无法弄清楚如何做到这一点。我一直试图以返回StartActivity的方式重载onBackPressed(),但没有成功;做类似的事情:

public void onBackPressed() {
    Intent i = new Intent(this, StartActivity.class);
    startActivity(i);
}

意味着堆栈永远增长,即A - > B - > A离开ABA而不仅仅是A。

我知道一般活动流程(http://developer.android.com/reference/android/app/Activity.html)。

我是以错误的方式启动GameActivity吗?

作为对僚机的回应,我知道各种活动状态,如果需要释放内存,可能会调用onDestroy()。我在onPause()上保存游戏状态并在onResume()上加载,但不是当时内存所处的完整状态。

如果我按下“home”,应用程序将“最小化”,并返回到重新启动时的位置 - 未调用onDestroy()。我正在尝试模拟此行为,但将应用程序返回到StartActivity而不是“home”。

后退按钮总是调用onDestroy(),因为我可以从文档中收集(或至少完成())。

发生这种情况时,所有游戏都会保存完整状态吗?我会感到惊讶,但也许他们会这样做。

1 个答案:

答案 0 :(得分:3)

按下后退按钮时,没有活动完全被破坏。 Android维护着一堆正在运行的活动。当用户按下后退按钮时,当前活动从堆栈中弹出,前一个活动显示。但弹出的活动并没有被破坏,它仍在记忆中。只有当系统内存不足时才会销毁它,只有这样,才会调用onDestroy()

在您的活动由于用户按下后离开屏幕之前,Android会调用您的活动的多种方法,您可以在其中保存其状态,并在用户再次导航到您的活动时恢复它。在此处查看活动生命周期文档和示例:http://developer.android.com/reference/android/app/Activity.html

因此,在onPause()onStopped()方法之一上保存您的游戏活动状态,在主菜单上,如果用户选择“恢复”,请启动您的游戏活动从保存状态开始,否则如果用户选择“新游戏”,则从头开始游戏活动。