onActivityResult()被过早调用


92

我从工人的活动开始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除了没有OnCreate()使用加载偏好设置的类外,它没有任何代码addPreferencesFromResource

如今onActivityResult被称为具有requestCode1458过早,之后MyConfigure活动运行。在1.6和2.1仿真器以及2.1设备上进行了测试。有电话要setResult()埋在里面PreferenceActivity吗?还是该如何解释这个过早的电话呢?


1
活动不以setResults()结尾,而是以finish()结尾。您可以显示MyConfigure活动的onCreate方法吗?
谢丽尔·西蒙

是的,不是。但是,确实会提前调用setResult(),我想知道它是什么。onCreate的代码很简单:公共类MyConfigure扩展了PreferenceActivity {@Override protected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); }
尤金·梅耶夫斯基

您认为如何知道setResult被调用?
RoflcoptrException 2010年

这正是我提出的问题。要找出原因,为什么过早调用onActivityResult。
尤金·梅耶夫斯基

在此期间,logcat输出显示了什么?特别是“ ActivityManager”标记,它显示了正在调用的Intent。
Christopher Orr 2010年

Answers:


254

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

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

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


2
看来是个错误!^^很奇怪的行为!
费利佩

7
如果活动具有singleTask启动模式,则无需使用onActivityResult从子活动接收结果。子活动只需调用finish(),然后使用数据意图开始主要活动。在主要活动中,您必须重写onNewIntent方法并处理收到的意图。
Nik

43
launchMode =“ singleInstance”也会导致此行为
ffleandro 2013年

1
看来这对我来说不起作用,我在父级活动上尝试了singleTop,但无济于事。我还设置了意向标志为FLAG_ACTIVITY_SINGLE_TOP,但是请求现在显示正确的值,但结果始终为0
氖Warge

11
它发生在Kitkat 4.4.4上,而不发生在Lolipop上。
Somasundaram Mahesh

18

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


1
谢谢!这解决了我的问题。在某处对此有解释吗?
Conner Harkness'4

这些天来在docs中对此标志有一个解释:“当调用者从正在启动的活动中请求结果时,不能使用此标志”。好吧,这不是解释,而是至少一个警告!
代码Novitiate

4

我刚刚从我的Activity中删除了所有自定义的“ android:launchMode”,并且所有内容都像一个魅力一样起作用。当您完全不知道Android正在理解什么时,更改此设置不是一个好主意……Android有点棘手。


1

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

(是的,该标志与活动无关,但是我将其作为所有a弹枪解决另一个问题的一部分而使用了。)


-1

再次如Mayra的评论所述,setResult()与您的问题无关。由于某种原因,MyConfigure类会自行完成,并且在发生这种情况时PreferenceActivity仅假设可能会有结果,MyConfigure因为这就是您编写代码的方式。

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

因此,我认为最好集中精力于为什么您的MyConfigure课程被强制结束。


MyConfigure类未完成,您的猜测是错误的,对不起。如果可以,那么毫无疑问
Eugene Mayevski'Callback'2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.