立即触发 onActivityResult

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

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

然后我与该活动进行交互,按下一个调用 finish()的按钮,这次没有调用 onActivityResult()(因为显然已经返回了一个结果)。

有人明白吗? 有人见过这种行为吗?

36541 次浏览

如果您的活动以 singleInstancesingleTask的形式启动,则不能使用 startActivityForResult()standardsingleTop启动模式将解决这个问题。

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

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

来自 医生:

当调用方从 正在进行的活动。

对于 ActivityGroup或者 TabHost和其他的,可能 xxxActivity是它父母的 subActivity。然后 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

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

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

如果在清单文件中拼错了包或类名称,则 onActivityResult()也将传递 RESULT_CANCELED作为 resultCode

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

android:noHistory="true"

更改为“假”,现在工作正常。

在 Android Manifest 中,活动设置 android:launchMode="singleTop"为您希望打开的结果和当打开活动设置标志 intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

startActivityForResult()在安卓的前棒棒糖版本中不能与 singleInstancesingleTask活动一起工作。从 Android 5开始,它就可以工作了(更多细节见 这个答案)。

如果意图中包含 FLAG_ACTIVITY_NEW_TASK,它也会触发。

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

Android 4.4在活动结束后等待返回时有一个小问题 为了解决这种行为,重要的是设定:

  • 所有活动都将具有 一样任务 Affinity 属性
  • 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

如果在 AndroidManifest.xml 中的活动中定义了 android:noHistory="true",那么这里也会出现同样的问题。

另外,检查 Manifest 中的活动是否为 android: noHistory = “ true”,如果是,它将不工作。