如何让外部Activity上的startActivityForResult工作?

时间:2012-08-12 02:32:33

标签: android start-activity

搜索高和低对我的问题没有任何结果。因此,我终于发帖请求一些帮助。

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

但是,我找不到一种方法来返回对App A的响应。使用startActivityForResult()总是立即给我带有RESULT_CANCELED的onActivityResult()。经过进一步检查,logcat给了我一个警告,说明“活动正在启动,因此取消活动结果”。

我尝试使用不同的启动模式,动作过滤器(android.intent.action.PICK)制作应用B的活动,但我没有改变任何东西。

我想做不可能的事吗?根据我的理解,我尝试做的应该类似于使用第三方活动从设备的照片库中挑选图片。

修改

好的,我尝试从活动B中删除LAUNCHER类别,但它仍然无效。这是我的活动:

<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>

有人真的让这个工作吗?我开始怀疑启动另一个应用程序的活动永远不能返回结果,因为无论你在“intent-filter”中放置什么,它似乎总是会启动一项新任务。

3 个答案:

答案 0 :(得分:9)

确保您正在启动的Activity没有在清单中设置android:launchMode并检查android:taskAffinity未被使用。见这里:

http://developer.android.com/guide/topics/manifest/activity-element.html#aff

确保您用于启动活动的Intent没有设置FLAG_ACTIVITY_NEW_TASK。见这里:

http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_NEW_TASK

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

如果活动是作为新任务的一部分启动的,那么Android将立即使用RESULT_CANCELED调用onActivityResult(),因为一个任务中的活动无法将结果返回给另一个任务,只有同一任务中的活动才能执行此操作

答案 1 :(得分:1)

遇到同样的问题我看了一下源代码,以及为什么要添加NEW_TASK标志。

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

    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;
    }

当您拥有这两个应用时,您应该能够确保这些启动模式未在清单或意图中定义。

到目前为止,我无法找到任何其他不真实设置的NEW_TASK标志实例。

答案 2 :(得分:0)

在你的活动B中,你应该有这样的东西,

Intent intent = new Intent();
setResult(Activity.RESULT_OK, intent);
finish();

或者可以,

setResult(Activity.RESULT_OK);
finish();

您无需将任何数据传递给活动A。

否则,它将始终以结果代码Activity.RESULT_CANCELED;

结束
  

如果儿童活动由于任何原因(例如崩溃)而失败,则   父活动将收到代码为RESULT_CANCELED的结果。

希望这有帮助。