0

在我的应用程序中有三个活动:A、B 和 C。活动 A 是主要活动。

当我使用 A 从 A 启动 Activity B 时Intent,A 会自动销毁。但是,当我启动 B 时,我还没有完成 A。然后,当我按下设备中的后退按钮时,A 开始使用onCreate并且我丢失了所有数据,因为我没有使用Intent返回。

从 B 打开 C 时也会发生同样的情况。

button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                startActivity(new Intent(ActivityA.this,
                        ActivityB.class));
            }
        });

这是怎么回事?我该如何解决?

4

3 回答 3

4

这是我的一个错误,因为活动会自动销毁。我检查了下的选项Setting=>Developer Option=>Don't Keep Activities。由于一旦用户离开它就会破坏每个活动。

在此处输入图像描述

通过取消选中此选项,我的应用程序运行良好。

于 2014-03-21T11:11:46.017 回答
2

如果您使用“活动 B”来获得某种一次性结果,那么听起来您需要使用该startActivityForResult构造。请参阅 [文档]( http://developer.android.com/reference/android/app/Activity.html#startActivityForResult(android.content.Intent , int))

但是,要维护有关“活动 A”的状态信息而不将其保留在您希望将所有信息(用户已填写的字段等)Intent捆绑到传递给“活动 B”的包中的任何位置。此捆绑包被传递到“活动 B” onCreate(以及其他几个生命周期点),您可以在其中继续填充“活动 B”中的任何相关信息并将该信息写回意图包,然后再使用经过修改的捆绑包重新启动“活动 A”当您完成“活动 B”时。但这里有龙。我们的应用程序采用了这种特定的机制,对后台堆栈有严格的(错误的?)控制。具体来说,我们的“活动 A”具有特殊的清单声明android:noHistory="true". 这意味着我们还可以通过覆盖onBackPressed()每个活动并将同一个包发送到我们刚刚来自的活动的新实例来控制按下后退按钮时发生的情况。它看起来像一个普通的后台堆栈,但由于我们希望记住用户输入而不在任何地方保留该信息,所以它是一个可用的解决方案。

这允许类似向导的输入,向导输入的每个阶段都是它自己的活动,并且最后只保留经过验证和正确的信息。

另一种方法是将“活动 A”的数据临时存储在 SharedPreferences 区域中,以便在重新启动活动 A 时,您可以在离开时取出适当的位重新组装“活动 A”的原始状态。请放心,当 Android 想要杀死您的 Activity A 时,您几乎无能为力,但您可以使用此处概述的方法来适应它非常合理的杀死。

于 2013-03-01T14:22:36.633 回答
1

也许不是你在破坏你的活动。

从关于活动生命周期的页面:(强调我的)

如果一个活动被暂停或停止,系统可以通过要求它完成或简单地终止它的进程来从内存中删除该活动。当它再次显示给用户时,它必须完全重新启动并恢复到之前的状态。

有明确的说系统可以杀死你的活动进程。

一些可能性是您的设备内存不足,或者您的活动内存不足,导致系统将其杀死。

编辑

为了维护您的数据,即使它被破坏,活动之间也是如此。一种方法是使用 Application 类,在Using the Android Application class to persist data上查看这个答案,也许这就是你要找的。

于 2013-03-01T13:59:28.083 回答