【问题标题】:Android - Keep previously added intent extra when going up to parent activityAndroid - 在进入父活动时保留先前添加的额外意图
【发布时间】:2014-08-11 10:12:46
【问题描述】:

目前我正在使用Android,但在理解Activity 生命周期方面仍然存在一些问题。

让我用一个例子告诉你我的问题:

我的应用程序包含一个Navigation Drawer,允许使用它在不同的Fragments 之间切换。一个片段(片段 A)是一个包含一些项目的列表。单击一个项目会打开活动 B,该活动 B 可以描述为该项目的详细视图。 B 通过 Intent 接收所有必要信息,项目模型实现 Parcelable 并将其作为 Extra 放入 Intent。 Activity B 的button 打开地图视图Activity C。

A -(项目)-> B -> C

在B的Activity onCreate方法调用时,使用C的action bar中的Up按钮使应用崩溃

Item item = bundle.getParcelable("com.example.myapp.model.Item");

当然,因为详细视图 B 获得了必须从 A 显示的所有必要信息。我该如何解决这个问题?我希望能够在调用 C 并再次到达 B 时以某种方式存储该项目。 (使用 C 上的后退按钮可以正常工作)

【问题讨论】:

  • 使用 setIntent 函数将返回相同的意图设置回上一个活动。一段时间后,意图会失去。所以你需要重新设置。

标签: android android-intent android-activity android-lifecycle


【解决方案1】:

如果您已按照 android 开发者网站上的Providing up navigation 中所述实现向上导航,则只需将活动 B 的启动模式更改为 "singleTop." 即可修复错误。在应用程序的 manifest.xml 文件中进行设置,如下所示:

<activity ... launchMode="singleTop" ... />

现在发生的事情,大概是因为 B 的启动模式是标准的,是向上导航正在启动一个新的活动 B 实例;它没有得到 A 最初提供的附加功能。

当根据链接文档启动模式为“singleTop”时,

如果父Activity的启动模式为singleTop,或者upintent包含FLAG_ACTIVITY_CLEAR_TOP,父Activity被带到栈顶,并通过其onNewIntent()方法接收intent。

在 onNewIntent() 中,我相信(请检查这一点),您可以忽略新意图,因为您想继续使用活动 A 中的意图。

【讨论】:

  • 谢谢,这解决了我的问题!据我所知,当我从 C 返回 B 时不想对 Activity 做任何事情时,B 中不需要 onNewIntent() (当 A 调用 B 时,一切都已由 onCreate() 完成)。
  • 如果 B 在 C 上升之前被销毁会怎样?
  • 完美。有道理,即使我不喜欢 Android 有时会让我对这些事情感到困惑 :)
【解决方案2】:

** 当您从 B 中按 up 时,不要假设活动 B 仍然存在 **

您提到崩溃发生是因为“通常”

详细视图 B 获取必须从 A 显示的所有必要信息。

因此,在此流程活动中,C 必须向 B 提供该信息。您可以使用 getParentActivityIntent 方法执行此操作。该方法的基本实现会查看清单中的 parentActivityName 属性以创建意图。如果你覆盖它(在活动 C 中),你可以添加你需要的额外内容。

@Nullable
@Override
public Intent getParentActivityIntent() {
    Intent intent = super.getParentActivityIntent();
    if (intent != null)
        enhanceParentActivityIntent(intent);
    return intent;
}

private void enhanceParentActivityIntent(@NonNull Intent intent) {
    intent.putExtra("...", "...");
}

【讨论】:

    【解决方案3】:

    我会使用一个应用程序类来存储全局数据,如下所示: Using the Android Application class to persist data 这是一个可以被所有活动引用的单例对象

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-03
      相关资源
      最近更新 更多