Android-在进入父活动时保留先前添加的额外意图

Android-在进入父活动时保留先前添加的额外意图,android,android-intent,android-activity,android-lifecycle,Android,Android Intent,Android Activity,Android Lifecycle,目前我使用的是Android,在理解活动生命周期方面仍然存在一些问题 让我用一个例子来说明我的问题: 我的应用程序包含一个导航抽屉,可用于在不同片段之间切换。一个片段(片段A)是包含一些项目的列表。单击一个项目将打开活动B,该活动可以描述为该项目的详细视图。B通过意图接收所有必要的信息,项目模型实现Parcelable,并将其作为意图的额外信息。活动B的按钮打开地图视图活动C A-(项目)->B->C 当B Activity onCreate方法调用时,使用C操作栏中的Up按钮使应用程序崩溃 I

目前我使用的是
Android
,在理解
活动
生命周期方面仍然存在一些问题

让我用一个例子来说明我的问题:

我的应用程序包含一个
导航抽屉
,可用于在不同
片段
之间切换。一个片段(片段A)是包含一些项目的列表。单击一个项目将打开活动B,该活动可以描述为该项目的详细视图。B通过意图接收所有必要的信息,项目模型实现Parcelable,并将其作为
意图
的额外信息。活动B的
按钮打开地图视图活动C

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

当B Activity onCreate方法调用时,使用C操作栏中的Up按钮使应用程序崩溃

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

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

我将使用一个应用程序类来存储全局数据,如下所示:
这是一个可以被所有活动引用的单例对象

如果您已经在android开发者网站上实现了中所述的向上导航,您只需将活动B的启动模式更改为,就可以修复错误。在应用程序的manifest.xml文件中设置,如下所示:

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

现在发生的事情,大概是因为B的启动模式是标准的,是up navigation正在启动活动B的一个新实例;它没有得到最初由A提供的额外服务

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

如果父活动具有启动模式singleTop,或者up intent包含标志\u activity\u CLEAR\u TOP,则父活动将被带到堆栈顶部,并通过其onNewIntent()方法接收该intent


在onNewIntent()中,我相信(请勾选此项),您可以忽略新的意图,因为您希望继续使用活动A中的意图。

**当您按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("...", "...");
}

使用setIntent功能设置将相同的意图返回到上一个活动。一段时间后,意图就会丧失。所以你需要重新设置。谢谢,这解决了我的问题!就我所见,当我不想在从C返回B时对活动做任何处理时,B中不需要onNewIntent()(当A调用B时,onCreate()已经完成了所有操作)。如果B在C上升之前被销毁,会发生什么?太好了。这是有道理的,即使我不喜欢Android有时让我对这些东西感到困惑的方式:)