Android 如何使startActivityForResult外部活动正常工作?

Android 如何使startActivityForResult外部活动正常工作?,android,start-activity,Android,Start Activity,对我的问题到处寻找都没有结果。因此,我终于发帖请求一些帮助 我有两个应用程序,都是我写的。应用程序A启动应用程序B,通过Intent.putExtra()传入参数。当应用程序B启动时,这项工作非常好,参数传递得很好 但是,我找不到方法返回对应用程序a的响应。使用startActivityForResult()时,我总是会立即返回onActivityResult(),结果_被取消。在进一步检查后,logcat向我发出警告,说明“活动正在作为新任务启动,因此取消活动结果” 我试着用不同的启动模式和动

对我的问题到处寻找都没有结果。因此,我终于发帖请求一些帮助

我有两个应用程序,都是我写的。应用程序A启动应用程序B,通过Intent.putExtra()传入参数。当应用程序B启动时,这项工作非常好,参数传递得很好

但是,我找不到方法返回对应用程序a的响应。使用startActivityForResult()时,我总是会立即返回onActivityResult(),结果_被取消。在进一步检查后,logcat向我发出警告,说明“活动正在作为新任务启动,因此取消活动结果”

我试着用不同的启动模式和动作过滤器(android.intent.action.PICK)制作应用程序B的活动,但我所做的一切都没有改变

我想做不可能的事吗?据我所知,我试图做的事情应该类似于使用第三方活动从设备的照片库中拾取图片

编辑:

好的,我试着从活动B中删除启动器类别,但仍然不起作用。以下是我的活动:

<activity android:name=".${CLASSNAME}" android:label="@string/app_name" android:configChanges="mcc|mnc|locale|keyboardHidden|orientation" android:launchMode="standard">
    <intent-filter>
        <action android:name="android.intent.action.PICK" />
    </intent-filter>
</activity>


有人真的有这个功能吗?我开始怀疑启动另一个应用程序的活动永远不会返回结果,因为无论您在“意图过滤器”中输入什么,它似乎总是会启动新任务。

在活动B中,您应该有这样的内容

Intent intent = new Intent();
setResult(Activity.RESULT_OK, intent);
finish();
或者可以,

setResult(Activity.RESULT_OK);
finish();
您不需要将任何数据传递给活动A

否则,它将始终以结果代码
活动结束。结果_已取消

如果子活动因任何原因(如崩溃)失败,则 父活动将收到一个结果,其中代码结果\u已取消


希望这有帮助。

确保您正在启动的活动没有在清单中设置android:launchMode,并检查android:taskAffinity是否未被使用。请看这里:

确保您用于启动活动的意图没有设置FLAG_activity_NEW_TASK。请看这里:

特别注意:“当调用方请求正在启动的活动的结果时,不能使用此标志。”


如果该活动是作为新任务的一部分启动的,那么Android将立即调用onActivityResult(),结果被取消,因为一个任务中的活动无法将结果返回给另一个任务,只有同一任务中的活动才能返回结果。

有同样的问题,我看了源代码,以及为什么要添加新的_任务标志

如果源活动A或目标活动B使用单实例启动模式,则会自动添加新的任务标志:

    if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
        // The original activity who is starting us is running as a single
        // instance...  this new activity it is starting must go on its
        // own task.
        launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
    } else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE
            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) {
        // The activity being started is a single instance...  it always
        // gets launched into its own task.
        launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
    }
由于您拥有这两个应用程序,您应该能够确保这些启动模式未在清单或意图中定义


到目前为止,我找不到任何其他不情愿设置新任务标志的实例。

发布您正在使用的代码,并启动intent for ActivityB。您应该能够这样放置:
this.setResult(Activity.RESULT\u OK,data)在第二个活动中返回到第一个。您可以发布清单文件吗?也许活动B有一些特殊的标记。。。活动B有问题,这会导致问题吗?我现在不在我的工作机器旁。我会试着把它去掉,看看效果如何。从我所读到的内容来看,开始一个不属于同一个包的活动总是会在一个新任务中开始?如果是这样的话,startActivityForResult就不能在另一个apk上启动外部活动了?我已经尝试过删除启动器类别的东西。也不管用。我在我的活动清单上编辑了我的原始帖子。@Lf3T-Hn4D你找到解决方案了吗?我实现了。问题是活动A甚至在活动B结束之前就调用了onActivityResult()。Logcat告诉我“活动作为新任务启动,因此取消活动结果”。因此,活动B似乎是作为一项新任务启动的,这并不奇怪,因为它是一个不同的apk应用程序?像image picker这样的实用程序活动是如何编写的?@Lf3T-Hn4D正如你提到的,你有
launcher
类别,它将作为新任务启动活动。因此,它将完全独立于发起它的活动。删除该类别样式,然后重试。啊。。好啊我会尝试一下,等我回到我的工作机器时再报告。:-)谢谢,我已经试过删除发射器类别的东西了。也不管用。我已经在我的活动清单上编辑了我的原始帖子。