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:由于异常活动,我们已阻止来自此设备的所有请求

Android:恢复 singleTask 活动

Android - 恢复上次查看的活动

Android :: 需要在android应用程序恢复不活动时执行一些任务

如何在android中恢复最近暂停的活动?

Android恢复活动变量消失了