【问题标题】:Intent data not clearing when user presses back button then recent apps button当用户按下返回按钮然后按下最近的应用程序按钮时,意图数据未清除
【发布时间】:2013-04-25 00:55:37
【问题描述】:

我对我正在开发的应用程序中遇到的这种行为感到困惑......

短:

当用户按下后退按钮离开应用程序然后按下最近按钮重新进入应用程序时,意图数据不会被清除。 (每隔一种情况,intent 数据就会被清除)

长:

我有一个带有启动屏幕的应用程序,用于收集从 URI 方案传入的数据。然后,我设置了将数据转发到主要活动的意图。主要活动有片段并且基于主/细节模板。

intent 数据在所有情况下都会被清除,例如按 home 键然后返回应用程序,按最近的应用程序按钮然后返回应用程序等。唯一的意图数据是未清除的情况是用户按下后退按钮,然后按下最近的应用按钮以返回应用程序。

涉及意图的相关代码sn-ps:

// Splash Screen Activity
@Override
protected void onPostExecute(Void result) {
    // Data is done downloading, pass notice and app ids to next activity
    Intent intent = new Intent(getBaseContext(), ListActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.putExtra("id1", id1);
    intent.putExtra("id2", id2);
    intent.putExtra("id3", id3);
    startActivity(intent);
    finish();
}


// ListActivity retrieving intent data
Intent intent = getIntent();
if (intent != null) {
    this.id1 = intent.getExtras().getString("id1");
    this.id2 = intent.getExtras().getString("id2");
    this.id3 = intent.getExtras().getString("id3");
}


// ListActivity clearing intent data
@Override
public void onPause() {
    super.onPause();
    // Clear intent data
    Intent intent = getIntent();
    intent.putExtra("id1", "");
    intent.putExtra("id2", "");
    intent.putExtra("id3", "");
}

我想指出,我也尝试过使用 intent.removeExtra("id1") 但这也没有用。

知道发生了什么吗?即使始终调用 onPause() 来清除 Intent 数据,Android 也好像保留了旧 Intent。

【问题讨论】:

    标签: android android-intent


    【解决方案1】:

    实际上这是由于 Android 从历史记录启动应用程序,因此 Intent Extras 仍然存在

    参考这个问题Android: Starting app from 'recent applications' starts it with the last set of extras used in an intent

    所以添加这个条件来处理这个特殊情况为我修复了它

    int flags = getActivity().getIntent().getFlags();       
    if ((flags & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0) {
        // The activity was launched from history
        // remove extras here
    }
    

    【讨论】:

    • 太棒了 - 这是解决这个持久问题的答案!谢谢!
    【解决方案2】:

    我相信这里的区别在于 Back 键实际上会导致您的 Activity 完成,而按 Home 会导致您的 Activity 暂停,但未完成。
    因此,当您的进程回到前面时在 Home 案例中,它只是恢复一个已经存在的 Activity 实例,而在 Back 案例中,系统正在实例化您的 Activity 的新副本,调用onCreate(),并将为该活动记录的最后一个 Intent 的新副本交给它.

    【讨论】:

      【解决方案3】:

      onPause() 中,您正在清除Intent 的“副本”中的额外内容。您可以尝试添加

      setIntent(intent);
      

      在您清除附加内容后发送至onPause()(尽管调用removeExtra() 也可能会起作用,而不是将附加内容设置为空字符串)。

      注意: 但是,我认为这种设计是有缺陷的。您不应该使用Intent 来跟踪应用程序中的状态。您应该在共享首选项中保存一些状态,因为这将在您的应用程序被杀死/重新启动、手机重新启动或其他任何情况下继续存在。

      问题是新的Intent没有持久化,所以如果用户按下HOME按钮并且你的应用程序进入后台,然后Android因为它不活动而杀死你的应用程序,当用户返回到应用,Android 将为您的应用创建一个新进程,并使用原始 Intent 重新创建 Activity。

      此外,如果您阅读getIntent() 的文档,它会说它返回启动活动的 Intent

      【讨论】:

      • 我不使用意图来保存应用程序状态。 Intent 主要用于传递从自定义 Uri 方案接收到的数据,该方案用于启动我的应用程序。 Uri 方案包含一个 id,该 id 在初始屏幕中检索,然后传递给 listactivity,如上面的代码所示。我也尝试了 setIntent(intent) 和 setIntent(null) 但这并没有解决问题。
      • 您显示的代码与ListActivity 中的 Intent 有冲突。你为什么这样做?如果您使用附加功能将一些参数从启动屏幕传递到ListActivity,那么您不应该尝试从Intent 中清除它们。如果您需要帮助解决此问题,您需要显示更多代码。
      【解决方案4】:

      为了解决我面临的问题,我选择使用 SharedPreferences 作为在活动之间传递数据的一种方式。

      我知道 SharedPreferences 通常不用于此目的,但它解决了我的问题并且有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-12
        • 1970-01-01
        相关资源
        最近更新 更多