Java 按下子活动中的“向上”按钮时,父活动中的savedInstanceState为空

Java 按下子活动中的“向上”按钮时,父活动中的savedInstanceState为空,java,android,onsaveinstancestate,up-button,Java,Android,Onsaveinstancestate,Up Button,我在应用程序中使用“向上”按钮时遇到问题。我已经读过很多关于类似问题的帖子,但没有一篇是针对我想要解决的问题 我有两个活动-A和B。 显示SQLite数据库中所选类别的任务列表。每个任务都属于一个类别,因此,a有一个从Intent传递的私有变量topicId(它充当过滤器)。当我点击一个任务时,它会打开活动B,您可以编辑它。B有一个向上按钮,它会将您引导回A(任务列表) 由于A从intent中获取topicId,当我单击B中的Up按钮时,A中没有intent,并且topicId默认为-1。我认为

我在应用程序中使用“向上”按钮时遇到问题。我已经读过很多关于类似问题的帖子,但没有一篇是针对我想要解决的问题

我有两个活动-
A
B
。 显示SQLite数据库中所选类别的任务列表。每个任务都属于一个类别,因此,a有一个从Intent传递的私有变量
topicId
(它充当过滤器)。当我点击一个任务时,它会打开活动B,您可以编辑它。B有一个向上按钮,它会将您引导回A(任务列表)

由于A从intent中获取topicId,当我单击B中的Up按钮时,A中没有intent,并且topicId默认为-1。我认为保存id很容易-只需这样保存即可:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("topicId", this.TOPIC_ID);
}
在我使用的onCreate()方法中:

if(savedInstanceState != null) {
    this.TOPIC_ID = savedInstanceState.getInt("topicId");
}
但是,传递给onCreate()的savedInstanceState总是
null
。 我将日志放在A的生命周期方法中,以查看发生了什么

  • 我正在运行-
    onCreate()
    并且捆绑包为空
  • 我单击列表中的一个任务(一个片段,加载到ViewPager中)
  • onSaveInstanceState()
    运行并保存我的Id
  • 现在我在B中,我单击向上按钮(而不是手机上的后退键)
  • 它运行A的
    onDestroy()
    ,然后运行A的
    onCreate()
    ,包为
    null
    有人能告诉我为什么在这种情况下,
    onCreate()
    中的Bundle为null吗?我已在manifest.xml中将B的父活动设置为A。我还阅读了一个解决方案,其中假设您在清单中为a添加
    android:launchMode=“singleTop”

    然而,这不是我想要的——如果设置为singleTop,当您单击Up按钮时,父活动不会被销毁。我希望它被销毁并重新创建,因为在B中,我对一个任务进行了更改,我希望在单击Up时看到该任务立即从a中的DB重新加载

    如果有人告诉我为什么Android会将
    null
    包传递给
    onCreate()
    ,我将不胜感激。我已经尝试将此代码添加到B中,但没有成功:

    Intent intent = NavUtils.getParentActivityIntent(this);
    intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    NavUtils.navigateUpFromSameTask(this);
    
    我认为这篇文章是关于同一个问题的,但它已经有四年没有被回复了

    如果你需要的话,我会发布代码。我不想一开始就太过势不可挡



    编辑

    经过进一步搜索,我找到了以下解决方案:

    据说:

    按“上一步”时,活动将被销毁,其拥有的数据将丢失。在此之后,当您重新打开应用程序时,由于正在创建一个新的、新的实例,因此捆绑包中始终会出现null

    由于某些更改(如旋转)或由于在后台长时间暂停而重新创建活动时,将使用Bundle savedInstanceState

    如果您想保留一些数据,请考虑小件的SyrdPoopy,或者数据库(SQLite,Valite)或大文件的文件。


    据我所知,Android只在某些特定情况下使用该捆绑包,例如当您关闭/打开屏幕时,单击Home按钮或更改屏幕方向。在像我这样的情况下,您必须依赖其他一些功能,如
    SharedReferences
    类。我欢迎比我有更高知识的人来解释这件事。

    你是如何开始活动B的?SaveInstanceState是Android在需要内存并终止活动以释放内存时所做的事情/在活动A中,我有一个带有RecyclerView的片段,其中有多个任务的CardView。我在任务上附加了一个onClickListener,当单击其中一个时,以下代码将处理它:
    @Override
    public void onItemClick(int-id){
    Intent-Intent=new-Intent(getActivity(),CreateTaskActivity.class);
    Intent.putExtra(CreateTaskActivity.EXTRA\u-TASK\u-id,id)
    开始活动(意图);
    }
    活动b的android:launchMode是什么?它没有指定,所以它必须是默认值
    标准
    。后退按钮销毁活动,最好的方法是为此使用SharedReferences。