Android主要活动销毁(完成)自动
Posted
技术标签:
【中文标题】Android主要活动销毁(完成)自动【英文标题】:Android main activity destroy(finish) automatically 【发布时间】:2013-03-01 13:47:19 【问题描述】:在我的应用程序中有三个活动:A、B 和 C。活动 A 是主要活动。
当我使用 Intent
从 A 启动 Activity B 时,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));
);
发生了什么事?我该如何解决这个问题?
【问题讨论】:
我们能有代码吗? 你可能在开始你的Activity B
之后给finish()
。
是的,我更新了我的问题
不,我没有在 Intent 中调用 finish()
你必须调用 finish() 来销毁你的活动。
【参考方案1】:
这是我的错误,因为活动会自动销毁。我检查了Setting=>Developer Option=>Don't Keep Activities
下的选项。由于一旦用户离开它就会破坏每个活动。
通过取消选中此选项,我的应用程序运行良好。
【讨论】:
【参考方案2】:如果您使用“活动 B”来获得某种一次性结果,那么听起来您需要使用 startActivityForResult
构造。请参阅[文档](http://developer.android.com/reference/android/app/Activity.html#startActivityForResult(android.content.Intent, int))
然而,要维护有关“活动 A”的状态信息,而不是将其保存在您希望将所有信息(用户填写的字段等)捆绑到传递的 Intent
捆绑包中的任何位置到“活动 B”。此捆绑包被传递到“活动 B”onCreate
(以及其他一些生命周期点),您可以在其中继续填充“活动 B”中的任何相关信息并将该信息写回意图包,然后再使用 modd 重新启动“活动 A”完成“活动 B”后,就可以进行捆绑。但这里有龙。我们的应用程序采用了这种特定的机制,对后台堆栈有严格的(错误的?)控制。具体来说,我们的“活动 A”具有 android:noHistory="true"
的特殊清单声明。这意味着我们还可以通过在每个活动上覆盖 onBackPressed()
并将同一个包发送到我们刚刚来自的活动的 新实例 来控制按下后退按钮时发生的情况。它看起来像一个普通的后台堆栈,但由于我们想要记住用户输入而不是在任何地方持久化该信息,所以它是一个可用的解决方案。
这允许类似向导的输入,向导输入的每个阶段都是它自己的活动,并且只有经过验证和正确的信息才会在最后持久化。
另一种方法是将“Activity A”的数据临时存储在 SharedPreferences 区域中,以便在重新启动 Activity A 时,您可以在离开时取出适当的位重新组装“Activity A”的原始状态。请放心,当 Android 想要杀死您的 Activity A 时,您几乎无能为力,但您可以使用此处概述的方法来适应它非常合理的杀死。
【讨论】:
【参考方案3】:也许不是你在破坏你的活动。
来自关于Activity Life cycle的页面:(强调我的)
如果某个活动被暂停或停止,系统可以删除该活动 通过要求它完成或简单地杀死它来从内存中提取 过程。当它再次显示给用户时,它必须是完整的 重新启动并恢复到之前的状态。
里面明确说系统可以杀死你的activity进程。
有些可能是您的设备内存不足,或者您的活动内存不足,导致系统将其杀死。
编辑
为了维护您的数据,即使在活动之间被破坏。一种方法是使用 Application 类,在Using the Android Application class to persist data 上查看这个答案,也许这就是你要找的。p>
【讨论】:
是否有任何解决方案可以避免这种情况或停止销毁活动?以上是关于Android主要活动销毁(完成)自动的主要内容,如果未能解决你的问题,请参考以下文章