4

我在我的应用程序中使用向上按钮时遇到问题。我已经阅读过许多处理类似问题的帖子,但没有一篇解决了我想要解决的相同问题。

我有两个活动 -AB。A 显示 SQLite 数据库中所选类别的任务列表。每个任务都属于一个类别,因此,A 有一个topicId从 Intent 传递的私有变量(它充当过滤器)。当我单击一个任务时,它会打开允许您编辑它的活动 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. 我将 Log 放入 A 的生命周期方法中,看看会发生什么。

  1. 我在 A -onCreate()运行并且捆绑包为空
  2. 我单击列表中的一个任务(一个片段,在 ViewPager 中加载)
  3. onSaveInstanceState()运行并保存我的 ID
  4. 现在我在 B 并单击向上按钮(不是手机上的返回键)
  5. 它运行 A's onDestroy(),然后onCreate()是 A's 和 bundle null

有人能告诉我为什么onCreate()在这种情况下 Bundle in 为空吗?我在 manifest.xml 中将 B 的父活动设置为 A。我还阅读了一个解决方案,假设您android:launchMode="singleTop"在清单中为 A添加。

然而,这不是我想要的——如果它设置为 singleTop,当您单击向上按钮时,父活动不会被破坏。我希望将其销毁并重新创建,因为在 BI 中更改了我希望在单击向上时立即从 A 中的数据库重新加载的任务。

如果有人告诉我为什么 Android 将null捆绑包传递给onCreate(). 我已经尝试将此代码添加到 B 并且它不起作用:

Intent intent = NavUtils.getParentActivityIntent(this);
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
NavUtils.navigateUpFromSameTask(this);

我认为这篇文章是关于同样的问题,但它还没有回答 4 年...

如果您需要,我将发布代码。我不想一开始就太过分了。



编辑

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

据说:

当您按下返回时,Activity 被破坏并且它拥有的数据丢失。在此之后,当您重新打开应用程序时,您将始终在捆绑包中获得 null,因为正在创建一个新的、全新的实例。

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

如果您想保留一些数据,请考虑将 SharedPreferences 用于小型数据,或者考虑使用数据库(SQLite、Realm)或文件用于大型数据。

据我了解,Android 仅在某些特定情况下使用 Bundle,例如当您关闭/打开屏幕、单击主页按钮或更改屏幕方向时。在像我这样的情况下,您必须依赖其他一些功能,例如SharedPreferences类。我欢迎拥有比我更高级知识的人对此事有更多的了解。

4

0 回答 0