搜索高和低对我的问题没有任何结果。因此,我终于发帖请求一些帮助。
我有两个应用程序,都是我写的。 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”中放置什么,它似乎总是会启动一项新任务。
答案 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的结果。
希望这有帮助。