Android阻止恢复活动
Posted
技术标签:
【中文标题】Android阻止恢复活动【英文标题】:Android prevent restoring the activity 【发布时间】:2013-08-08 03:23:56 【问题描述】:我有一个查看页面,里面有很多片段。当活动被发送到后台并且需要资源时,操作系统将杀死应用程序或至少一些片段。当我返回活动时,它崩溃了,因为活动试图附加它在清理之前持有的所有片段的新实例,现在一些字段为空。这当然可以通过使用 Bundles 正确实现状态保存和恢复来解决,但我不想这样做。 相反,我想防止恢复片段。有没有办法告诉操作系统,一旦它发送了 GC 并销毁了碎片,它就不应该费心重新创建它们?清理完成后,我希望在返回时简单地重新创建活动,就好像用户通过点击图标启动它一样。有机会吗?
这里建议的解决方案https://***.com/a/15683289/552735 不起作用。它会导致异常 java.lang.IllegalStateException:键 f2 的片段不再存在:索引 3
【问题讨论】:
您是否尝试在持有您的碎片的活动的onStop()
方法中添加finish()
?它不会保存任何状态。
每次发送到后台时都会杀死活动,即使我按下主页按钮也是如此。这不是我想要的——我只希望操作系统停止重新创建在销毁之前存在的所有片段。据我所知,ViewPager 有它自己的状态恢复机制,这就是导致这些问题的原因。
【参考方案1】:
我遇到了这样的问题。这是我修复它的方法:
@Override
protected void onSaveInstanceState(Bundle savedInstanceState)
savedInstanceState.clear();
请注意,此方法将确保在 Activity 被系统杀死时绝对不会存储任何 UI 状态信息 - 这具有在 onRestoreInstanceState()
在 @987654323 之后使用相同的 Bundle 调用时也不会恢复任何视图的效果@。
【讨论】:
这不是解决方案这是对症治疗 如果恢复活动状态根本不重要或不重要,这是一个非常好的解决方案。这样,整个活动将再次重新创建,一切正常。【参考方案2】:您不能禁用保存/恢复实例状态操作。如果您不想实际实现此逻辑,则必须重新加载表单,尤其是当您的表单大量加载片段时。
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState)
super.onRestoreInstanceState(savedInstanceState);
startActivity(new Intent(this,YOUR_ACTIVITY.class));
finish();
【讨论】:
虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高答案的长期价值。以上是关于Android阻止恢复活动的主要内容,如果未能解决你的问题,请参考以下文章
Android.FirebaseUI-Android:由于异常活动,我们已阻止来自此设备的所有请求