【问题标题】:Android onCreate() and onResume() queryAndroid onCreate() 和 onResume() 查询
【发布时间】:2014-02-09 03:22:53
【问题描述】:

我有 3 个班级 ABC

我将一些对象从 A 传递到 B。在 B 中,在onCreate() 中,我将它们从意图中提取出来,并将它们保留为类变量。现在活动 B 允许用户编辑这些对象。这通过 startActivityForResult() 将对象从 B 传递到 C

现在,当用户完成编辑后,C 将结果 int 与修改后的对象一起传递回 B,然后完成。现在,当我回到 B,在onActivityResult() 中,我将这些对象拉出,并更新各自的类变量。但是 onCreate() 再次被调用,并且该类恢复为 AB 的对象,而不是保留 C 的对象给了B

现在如果让 BonCreate() 每次都访问数据库,显然它工作正常。但这似乎很浪费。

那么,我该如何处理这种情况呢?如果onCreate()无论如何都会被调用,那么onResume()startActivityForResult()onActivityResult()似乎是没用的,我还不如把所有代码都放在onCreate()中。

请指教!

这是将用户从 B 带到 C

的代码
    public void goToC(View v) {

        Intent intent = new Intent(this, C.class);
        intent.putExtra("STUFF", stuff);
        startActivityForResult(intent, 1);

}

这是 C 中的代码,将数据传回 B

long rowsUpdated = myModel.updateStuff(this, stuff);

if (rowsUpdated == 1) {
    Intent intent = new Intent(this, B.class);
    // put the data in the intent
    intent.putExtra("STUFF", stuff);
    // set the flags to reuse B
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
    // set result code to notify the ItemEntriesActivity
    setResult(1, intent);
    // finish the current activity i.e. C
    finish();
}

这是接收上述数据的B中的代码

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
        super.onActivityResult(requestCode, resultCode, intent);
        if (intent != null) {
            switch (resultCode) {
            case 1:
                // Update the class variable, so that onResume() gets the updated value
                stuff = intent.getExtras().getParcelable("STUFF");
                break;
            default:
                break;
            }

        }
    }

正如我所说,这段代码可以正常工作,但由于 B.onCreate() 在此之后执行,活动 B 最终会再次使用旧值。

更新:从C回到B时,我尝试使用intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP)。这仍然不起作用。我在 B 的任何地方都没有打电话给finish()。任何建议表示赞赏!!!

更新 2:当我在 BonStop() 中放置一个调试点时,一旦切换到 C 就会调用它强>。难怪 B 中的onCreate() 会被调用。现在我的问题是为什么onStop() 会被调用。我在 C 中做的唯一“不自然”的事情是使用 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 在没有键盘的情况下显示 TextEdits。所以我尝试将android:configChanges="keyboard|keyboardHidden" 添加到清单中的活动中,没有区别。再次感谢任何建议。

【问题讨论】:

  • onCreate 在必须(重新)创建活动并且您无法阻止这种情况发生时调用。原始意图很有用,因此您获得了 2 个不同的意图,您必须以不覆盖它的方式对其进行管理。
  • 将修改后的变量写入意图(或以其他方式保存)。然后检查修改后的值,并在 OnCreate 中加载它们以代替默认值。
  • 当我在 B 中执行 getIntent() 时,我总是收到从 A 发送的那个。这是因为我在 中调用 finish() 而不是 startActivity() b>C。那么我应该继续删除onResume()onActivityResult()等??
  • See this answer 我认为您正在尝试访问错误的Intent 数据。
  • 我在onActivityResult() 中得到了正确的意图,在onCreate() 中得到了正确的意图。所以这不是问题。我的问题是,我应该只从 C 调用 startActivity(A.class) 而不是完成 C,因为无论如何都会调用 onCreate;还是有更好的方法?

标签: android android-lifecycle oncreate onresume


【解决方案1】:

您正在创建 Intent 以供使用

Intent intent = new Intent(this, B.class);

此构造函数将创建B 的另一个实例,它确实会调用onCreate()。你应该使用一个空的构造函数

Intent intent = new Intent();
// set result code to notify the ItemEntriesActivity
setResult(1, intent);
// finish the current activity i.e. C
finish();

【讨论】:

  • 感谢您的宝贵时间,但此修改并未改变结果。不过,这是有道理的。我想我需要阅读更多关于 Intents 的内容。调试后, onCreate() 仍然被击中。还有什么想法吗?
  • 嗯……暂时没有。这应该已经解决了。你不会在B 中打电话给finish(),对吧?我以前遇到过这样的问题,Intent 构造函数通常是罪魁祸首。
  • 不,我已经发布了将用户从 B 带到 C 的代码。它几乎只是使用新的 Intent 调用 startActivityForResult()。不过感谢您的时间!我很感激!
  • 我现在不确定。我需要尽快入睡,但如果我早上想到了什么问题并没有解决,那么我会告诉你的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
  • 1970-01-01
相关资源
最近更新 更多