Android-startActivityForResult立即触发onActivityResult


144

我正在使用call从我的应用程序中的主要活动中启动活动startActivityForResult(intent, ACTIVITY_TYPE),而所有活动都只有一个活动。

调用该onActivityResult()函数后,将根据需要启动该活动,但是在日志中,我可以看到它立即被触发。活动显示,但RESULT_CANCELED立即返回onActivityResult()

然后,我与互动活动,按该呼叫的按钮finish(),并且onActivityResult()不叫这个时候(因为很明显的结果已经返回)。

这对任何人有意义吗?有人见过这种行为吗?

Answers:


315

startActivityForResult()如果您的活动是以singleInstance或发起的,则无法使用singleTaskstandardsingleTop启动模式将解决此问题。


2
谢谢你们,我已经在清单文件中把它忘了,并且完全忘了
TomBomb 2011年

9
哇!这似乎是添加到javadocs中的显而易见的事情!我浪费了整个晚上,试图使它正常工作,这个答案让我想起我的活动设置为singleTop。
swooby 2013年

20
singleTop对我来说似乎很好,singleTask但是引起了这个问题,因此singleInstance也肯定会这样做
darnmason

4
我也花了太长时间调试了这个!谢谢!!
suomi35

4
就我而言,没有将任何类定义为singleInstance或singleTop,但是它仍在发生...任何建议吗?
CoDe 2014年

110

此外,请确保该意图没有Intent.FLAG_ACTIVITY_NEW_TASK设置。

文档

当调用者从正在启动的活动中请求结果时,不能使用此标志。


3
这解决了我的问题。该问题不是由singleInstance,singleTop或singleTask引起的。
戴安娜(Diana)2013年

您是薄荷糖(挽救生命)。这是我的确切问题,当时我希望用户捕获片段中的图像
kyay

@Diana,您还记得所用的内容Intent.FLAG_ACTIVITY_NEW_TASK吗?
Keselme,

@Keselme对不起,已经很长时间了,我希望能为您提供帮助,但我不记得了,也无法再访问该代码。
戴安娜

是的,修复它。startActivityForResult不应该与Intent.FLAG_ACTIVITY_NEW_TASK一起使用
hanilozmen

21

我以前已经看到过此行为,请确保您的目标活动(该特殊活动)不在singleInstanceAndroidManifest文件中。如果Activity是singleInstance,那么它将RESULT_CANCELED在启动之前返回!


18

我还想补充一点,您可以使用以下命令调用外部应用程序:默认情况下,该应用程序
Intent in = caller.getPackageManager().getLaunchIntentForPackage("com.your.package.here");
会创建一个具有Intent.FLAG_ACTIVITY_NEW_TASK添加意图的应用程序,因此调用:
in.setFlags(0);
它将清除该标志,然后您可以继续执行以下操作:startActivityForResult(in, action);

我这样做的原因是,我有一个实用程序应用程序,该实用程序应用程序在其他几个应用程序之间具有共同的功能,因此我可以将代码更改保留在一个位置,而不必担心多个更新。


我知道这很旧了,但是对我来说这绝对是无价之宝,我想向用户表示感谢,并指出任何在活动之间跳来跳去的人都觉得这真是太贵了!在一次黑客马拉松中救了我的屁股;)
Wes Winn 2014年

这是需要更多注意的地方。这是最好的解决方案,非常适合我。您节省了我很多时间,非常感谢。
阿里特拉·罗伊

投票赞成这个答案,因为这是我今天早上遇到的确切问题!感谢您的解决方案!
威尔·约翰逊

谢谢。intent.setFlags(0)解决了这个问题。现在第二个应用程序开始正常运行,并将结果返回给调用应用程序
Niaz

5

startActivityForResult()不适用于棒棒糖之前的Android版本中的singleInstancesingleTask活动。从Android 5开始,它可以工作(有关更多详细信息,请参见此答案)。


5

如果FLAG_ACTIVITY_NEW_TASK您有意图,它也会触发。

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(intent, REQUEST_CODE);

谢谢。我在活动中添加了FLAG_ACTIVITY_NEW_TASK。
Chirag Savsani

1

我的问题是通话活动。它在AndroidManifest中的声明具有以下属性:

android:noHistory="true"

将其更改为“ false”,现在可以正常工作。


1

Android 4.4有一个小问题,等待在结束活动结束时返回,要解决此问题,重要的是设置:

  • 所有活动将具有相同的任务亲和力属性。(TaskAffinity = "[SAME STRING]"
  • launchmode=singleTop,
  • launchIntent.SetFlags(0); // for reset default Intent flags if you launch from package manager

此解决方案适用于所有版本的Android

参见TaskAffinity:https://asyoulook.com/computers%20&%20internet/android-onactivityresult-being-call-instantly/1004072


1

另外,请检查清单中活动的android:noHistory =“ true”,如果是,它将无法正常工作。


0

对于ActivityGroupTabHost其他,也许xxxActivitysubActivity其父级的。这时startActivityForResult不能工作,但父母可以得到结果。

  1. getParent().startActivityForResult()从您的子活动中致电

  2. 您的父母ActivityGroup将能够处理onActivityResult。因此,我创建了的子类ActivityGroup并对其进行处理onActivityResult

  3. 您可以根据需要将结果重新路由回子活动。只需通过获取当前活动即可getLocalActivityManager().getCurrentActivity()。我的子活动继承自自定义活动,因此我handleActivityResult(requestCode, resultCode, data)在该子类中添加了一个ActivityGroup要调用的子活动。

示例:http//www.cnblogs.com/relinson/archive/2012/03/25/startActivityForResult.html


在调用默认的网络浏览器时,您如何看待这种特殊情况:codeproject.com/Questions/990063/…–
Ahmad

0

onActivityResult()也将通过RESULT_CANCELEDresultCode如果拼错清单文件包或类名。


0

android:launchMode="singleTop"要为活动设置的Android清单中,要打开结果并在打开活动设置标志时intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);


0

如果您android:noHistory="true"在AndroidManifest.xml中的活动中定义,则会在此处引起相同的问题。

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.