Android - startActivityForResult立即触发onActivityResult

Tom*_*omb 142 android android-activity

我正在使用电话从我的应用程序中的主要活动启动活动startActivityForResult(intent, ACTIVITY_TYPE),它们都在工作但只有一个.

这个,当被调用时,根据需要启动活动,但在日志中我可以看到它onActivityResult()立即被触发.活动显示但RESULT_CANCELED立即返回onActivityResult().

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

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

Fal*_*rri 309

startActivityForResult()如果您的活动是作为singleInstance或启动的,则无法使用singleTask.standardsingleTop启动模式将解决问题.

  • `singleTop`对我来说似乎不错,`singleTask`然而导致了这个问题,因此`singleInstance`肯定也会这样做 (20认同)
  • 哇!这似乎是一个明显的事情添加到javadocs!我浪费了整整一个晚上试图让它工作,这个SO答案提醒我,我的活动设置为singleTop. (9认同)
  • 我也花了太长时间调试这个!谢谢!! (4认同)
  • 在我的情况下,没有将任何类定义为singleInstance或singleTop,但仍然发生了......任何建议? (3认同)
  • 感谢你们两个,我在我的清单文件中有这个,并且完全忘记了它 (2认同)

Jam*_*ang 96

另外,确保意图没有Intent.FLAG_ACTIVITY_NEW_TASK集合.

来自文档:

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

  • 这解决了我的问题.问题不是由singleInstance,singleTop或singleTask引起的. (3认同)

小智 21

我以前见过这种行为,请确保您的destnation活动(特殊活动)不在singleInstanceAndroidManifest文件中.如果活动是singleInstance,那么它将RESULT_CANCELED在启动之前返回!


小智 18

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

我这样做的原因是我有一个实用程序应用程序,它在一些其他应用程序之间具有通用功能,我可以将代码更改保存到一个位置,而不是担心多个更新.


noe*_*cus 5

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


Rog*_*ien 5

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

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(intent, REQUEST_CODE);
Run Code Online (Sandbox Code Playgroud)