当按下子活动中的向上按钮时,父活动中的savedInstanceState为null

时间:2018-05-02 11:37:37

标签: java android onsaveinstancestate up-button

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

我有两项活动 - public static TimeSpan LocalTimeSpanToUTC(TimeSpan ts) { DateTime dt = DateTime.Now.Date.Add(ts); DateTime dtUtc = dt.ToUniversalTime(); TimeSpan tsUtc = dtUtc.TimeOfDay; return tsUtc; } public static TimeSpan UTCTimeSpanToLocal(TimeSpan tsUtc) { DateTime dtUtc = DateTime.UtcNow.Date.Add(tsUtc); DateTime dt = dtUtc.ToLocalTime(); TimeSpan ts = dt.TimeOfDay; return ts; } A。 A显示SQLite数据库中所选类别的任务列表。每个任务都属于一个类别,因此,A有一个从Intent传递的私有变量B(它充当过滤器)。当我点击任务时,它会打开活动B,允许您编辑它。 B有一个向上按钮,可以将您带回A(带有任务的列表)。

由于A从intent获取topicId,当我单击B中的Up按钮时,A中没有intent,默认情况下topicId为-1。我认为保存id很容易 - 只需保存它:

topicId

在我使用的onCreate()方法中:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("topicId", this.TOPIC_ID);
}

但是,传递给onCreate()的savedInstanceState始终为if(savedInstanceState != null) { this.TOPIC_ID = savedInstanceState.getInt("topicId"); } 。 我把登录A的生命周期方法看看会发生什么。

  1. 我在A - null中运行并且捆绑包为空
  2. 我点击列表中的任务(片段,在ViewPager中加载)
  3. onCreate()运行并保存我的ID
  4. 现在我在B中点击向上按钮(而不是手机上的后退键)
  5. 它会运行A onSaveInstanceState(),然后是A onDestroy(),而捆绑包是onCreate()
  6. 有人可以告诉我为什么null中的Bundle在这种情况下为空吗?我已将B&#39的父活动设置为manifest.xml中的A.我还阅读了一个解决方案,假设您在A的清单中添加onCreate()

    然而,这不是我想要的 - 如果将其设置为singleTop,则单击“向上”按钮时不会销毁父活动。我希望将其销毁并重新创建,因为在B中我更改了一个任务,当我点击时,我想立即从A中的DB重新加载。

    如果有人告诉我为什么Android将android:launchMode="singleTop"捆绑包传递给null,我会感激不尽。我已经尝试将此代码添加到B中,但它没有工作:

    onCreate()

    我认为this帖子是关于同一个问题的,但它已经4年没有得到解答了......

    如果您需要,我会发布代码。我不想在开始时太过势不可挡。



    修改

    经过多次搜索后,我找到了这个解决方案:link

    它说:

      

    当您按下时,活动将被销毁,其中的数据将丢失。在此之后,当您重新打开应用程序时,正在创建新的新实例时,您将始终在包中获得null。

         

    Bundle savedInstanceState用于在由于某些更改(如旋转)重新创建活动时使用,或者因为它在后台暂停了很长时间。

         

    如果你想保留一些数据,可以考虑使用SharedPreferences来处理小东西,或者考虑数据库(SQLite,Realm)或大文件的文件。

    据我了解,仅在某些特定情况下,Android才会使用Bundle,例如关闭/打开屏幕,单击“主页”按钮或更改屏幕方向。在像我这样的情况下,您必须依赖其他一些功能,例如Intent intent = NavUtils.getParentActivityIntent(this); intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); NavUtils.navigateUpFromSameTask(this); 类。我欢迎拥有比我更先进的知识的人更多地了解这个问题。

0 个答案:

没有答案