Android - startActivityForResult立即触发onActivityResult

时间:2011-10-27 01:38:56

标签: android android-activity

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

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

然后我与活动进行互动,按下调用finish()的按钮,此时未调用onActivityResult()(因为显然已经返回了结果)。

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

13 个答案:

答案 0 :(得分:304)

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

答案 1 :(得分:93)

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

来自docs

  

当呼叫者请求结果时,不能使用此标志   正在推出的活动。

答案 2 :(得分:21)

之前我已经看过这种行为,请确保AndroidManifest文件中的destnation活动(特殊活动)不是singleInstance。如果活动为singleInstance,则会在启动之前返回RESULT_CANCELED

答案 3 :(得分:17)

我还想补充一点,您可以通过以下方式拨打外部应用:
Intent in = caller.getPackageManager().getLaunchIntentForPackage("com.your.package.here");
哪个会在默认情况下添加Intent.FLAG_ACTIVITY_NEW_TASK创建一个意图,因此请致电:
in.setFlags(0);
哪个将清除该标志,然后您可以继续:startActivityForResult(in, action);

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

答案 4 :(得分:5)

如果你的意图中有FLAG_ACTIVITY_NEW_TASK,它也会触发。

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

答案 5 :(得分:4)

startActivityForResult()不适用于Android前棒棒糖版本中的singleInstancesingleTask活动。从Android 5开始,它可以运行(有关详细信息,请参阅this answer)。

答案 6 :(得分:1)

我的问题在于调用活动。它在AndroidManifest中的声明具有以下属性:

android:noHistory="true"

将其更改为" false"现在工作正常。

答案 7 :(得分:1)

Android 4.4在关闭动作结束时等待返回有一个小问题 要解决此问题,请务必设置:

  • 所有活动都将具有相同任务Affinity属性。 (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-called-instantly/1004072

答案 8 :(得分:1)

还要检查清单中的活动是否为android:noHistory =“ true”,如果是,它将不起作用。

答案 9 :(得分:0)

对于ActivityGroupTabHost及其他人,可能xxxActivity是其父级subActivity。然后startActivityForResult无法工作,但父母可以获得结果。

  1. 从您的子活动

  2. 致电getParent().startActivityForResult()
  3. 您的父母(ActivityGroup)将能够处理onActivityResult。所以我创建了ActivityGroup的子类并处理了这个onActivityResult

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

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

答案 10 :(得分:0)

如果您在清单文件中拼错了包名或类名,

onActivityResult()也会将RESULT_CANCELED作为resultCode传递。

答案 11 :(得分:0)

在Android Manifest中为android:launchMode="singleTop"设置您想要打开结果的活动,同时打开活动设置标记intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

答案 12 :(得分:0)

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