【问题标题】:onActivityResult() called prematurelyonActivityResult() 过早调用
【发布时间】:2011-03-22 06:17:58
【问题描述】:

我从我的工作人员活动中启动Activity(PreferenceActivity 的后代),如下所示:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1458)
        loadInfo();
}

void showSettingsDialog()
{
    startActivityForResult(new Intent().setClass(this, MyConfigure.class), 1458);
}

MyConfigure 类没有任何 setResult() 调用。事实上,MyConfigure 类除了使用addPreferencesFromResource 加载首选项的OnCreate() 之外没有任何代码。

现在onActivityResult 在MyConfigure 活动运行之后过早地被requestCode 或1458 调用。在 1.6 和 2.1 仿真器以及 2.1 设备上进行了测试。 setResult()埋在PreferenceActivity的某个地方有电话吗?或者如何解释这个过早的呼叫?

【问题讨论】:

  • 一个活动不会在 setResults() 结束,它会在 finish() 结束。你能显示你的 MyConfigure 活动的 onCreate 方法吗?
  • 对,它没有。但是,确实会提前调用 setResult() ,我想知道它是什么。 onCreate 的代码很简单: public class MyConfigure extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); } }
  • 你怎么知道 setResult 被调用了?
  • 这正是我创建问题的目的。找出原因,为什么过早调用 onActivityResult。
  • logcat 输出在此期间的内容是什么?特别是“ActivityManager”标签,它显示正在调用哪些 Intent。

标签: android android-activity


【解决方案1】:

通过将启动模式更改为singleTop 来解决此问题:

    <activity
        android:name=".MainActivity"
        android:launchMode="singleTop">

Android 中有一个错误/功能 (?),它会立即报告 Activity 的结果(尚未设置),声明为 singleTask(尽管活动继续运行)。如果我们将父活动的launchMode 从singleTask 更改为singleTop,一切都会按预期进行——只有在活动完成后才会报告结果。虽然这种行为有一定的解释(只能存在一个singleTask 活动,并且可能会出现多个服务员),但这对我来说仍然是一个不合逻辑的限制。

【讨论】:

  • 这似乎是一个错误! ^^ 非常奇怪的行为!
  • 如果活动具有单任务启动模式,则不需要使用 onActivityResult 从子活动接收结果。子活动只需调用完成(),然后以数据意图启动主要活动。在主要活动中,您必须覆盖 onNewIntent 方法并处理收到的意图。
  • launchMode="singleInstance" 也会导致这种行为
  • 这似乎对我不起作用,我在父活动上尝试了 singleTop 但无济于事。我还将意图标志设置为 FLAG_ACTIVITY_SINGLE_TOP,尽管请求现在显示正确的值但结果始终为 0。
  • 发生在 Kitkat 4.4.4 上,不会发生在 Lolipop 上。
【解决方案2】:

在调用fragment.startActivityForResult(intent, 0); 之前删除intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 后我解决了我的问题。

【讨论】:

  • 谢谢!这解决了我的问题。在某处有对此的解释吗?
  • 这些天在标志的文档中有对此的解释“当调用者从正在启动的活动中请求结果时,无法使用此标志”。好吧,这不是解释,但至少是警告!
【解决方案3】:

我刚刚从我的 Activity 中删除了我所有的自定义“android:launchMode”,一切都像一个魅力。如果您不知道 Android 到底在理解什么,那么更改它不是一个好主意……Android 在这方面有点棘手。

【讨论】:

    【解决方案4】:

    当意图设置了Intent.FLAG_RECEIVER_FOREGROUND 标志时,这发生在我身上。

    (是的,该标志与活动无关,但作为a different problem 的霰弹枪解决方案的一部分,我的所有意图都包含它。)

    【讨论】:

      【解决方案5】:

      再次与 Mayra 的评论一样,setResult() 与您的问题无关。出于某种原因,MyConfigure 类会自行完成,而当它发生时,PreferenceActivity 只是假设MyConfigure 可能会产生结果,因为这就是您编写代码的方式。

      当您强制退回以 startActivityForResult()... 开头的任何活动时,也会发生这种情况。

      所以,我认为最好关注为什么你的MyConfigure 课程被强制结束。

      【讨论】:

      • MyConfigure 类没有完成,你的猜测是错误的,对不起。如果是这样,那就没有问题了
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-31
      • 2015-12-04
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      • 2020-11-15
      相关资源
      最近更新 更多