【问题标题】:Android prevent intent restoration after Destroy on back buttonAndroid 阻止后退按钮销毁后的意图恢复
【发布时间】:2015-03-19 18:10:48
【问题描述】:

我遇到了一个令人不快的问题,我不知道如何正确解决。

场景:

MainActivity 有一个方法 handleIncomingIntent()

此方法解析传入意图(用于服务或广播接收器)中的 Extras,并根据意图数据打开子活动。 因此,当传入的 Intent 有 A 类型的数据时,它将 startActivity(ActivityA.class),如果是 B 类型,则 startActivity(ActivityB.class),如果没有数据,它将留在 MainActivity

问题是当设备内存不足时,MainActivity 被破坏,而在 ActivityA 或 ActivityB 中。

因此,当使用 BackButton 时 - MainActivity 被恢复并且它的传入 Intent 恢复到与处理它之前相同的状态,尽管事实上我在我的 handleIncomingIntent() 方法的末尾执行了incomingIntent.removeExtras(KEY)。所以结果是——它再次启动了 Child Activity,它是一个循环!

我意识到我可以将一些 isIntentConsumed 标志存储到 onDestroy() 内部的内存中,然后读取它 restoreSavedState() 并使用它来解除意图,因为它已经被消耗了。

我只是觉得肯定有比我刚才描述的“创可贴”更好的方法。

亲切的问候, 帕维尔

【问题讨论】:

    标签: java android android-intent android-activity destroy


    【解决方案1】:

    如果停止的 Activity 因非正常情况(用户按下或 Activity 自行结束)的系统约束而被销毁,则将调用方法 onSaveInstanceState(Bundle savedInstanceState)。当用户导航回此类活动时,将调用 onRestoreInstanceState(Bundle savedInstanceState) 并将先前保存的包作为参数传递给 onRestoreInstanceState()onCreate().

    所以你可以查看onCreate(Bundle savedInstanceState)的实际参数,如果savedInstanceState != null你可以知道activity被重新创建了。希望有所帮助。

    【讨论】:

    • 谢谢特里,我今晚要试试,如果可行,我会投票。
    • 哇,原来如此简单。我没想到。谢谢特里。这是一个正确的答案
    • @PavelKirillov :) 加油,玩得开心!
    【解决方案2】:

    什么意思

    问题是当设备内存不足时,MainActivity 被破坏, 在 ActivityA 或 ActivityB 中。 目前还不清楚,也

    因此当使用返回按钮时

    我认为你在谈论活动 A 或 B 上的后退按钮按下事件,如果是这种情况,我建议你在移动到 A 或 B 活动后完成 MainActivity。然后在 A/B 活动上,您应该覆盖 onBackPressed() 方法,您应该再次启动主要活动并完成活动 A/B。

    这样做可以节省设备的低内存。顺便说一句,您是否也在真实设备上尝试过?如果没有,请在真实设备上检查并告诉我们。我希望它对你有用

    【讨论】:

    • 感谢鬼回复,是的。在真实设备上,有一个名为销毁非活动活动的开发人员选项。选中后,一旦活动 A/B 完全覆盖我的主要活动,操作系统就会破坏后者。但正如您猜对的那样,当我单击 A/B 上的后退按钮时,会重新创建 Main。但是打开 Main 的 Intent 恢复到原始状态,好像是第一次。
    • 我认为完成 Main 并从 A/B 重新创建它不是更好的模式,因为 A/B 可以被其他调用者打开,例如 C 或 D...所以我会结束将调用者传递给孩子并在后退按钮上管理各种场景,而不是完成 A/B 并获取它的来源。也许有一种很好的方法可以防止 Android 将 Intent 重新创建到其未更改的状态。我的工作正常,我觉得不合适。我在意图中添加了一个生成时间戳毫秒,并将其保存到共享首选项中,以便稍后查看我是否使用它并在需要时忽略它。
    • 我认为这是钻石问题:),但希望你能尽快改进你的编码并让自己满意
    猜你喜欢
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多