当您尝试startActivityForResult
Activity
launchMode="singleTask"
时;它不会返回onActivityResult
的任何值,并且当您设置launchMode="standard"
时;一切正常,但系统要求说这Activity
必须是singleTask
,无论如何要解决这个问题?
答案 0 :(得分:44)
For example, if the activity you are launching uses the singleTask launch mode,
it will not run in your task and thus you will immediately receive a cancel result.
似乎没有办法解决这个问题。
如果您是名为Activity的开发人员,则可以在某些结果可用时发送广播。然后,呼叫活动可以列出到这个广播。
答案 1 :(得分:38)
答案显示在班级startActivityUncheckedLocked
的功能ActivityStackSupervisor
中。
在Android 5.x之前,当启动一个活动时,如果launchMode是singleTask或singleInstance,它将首先检查launchMode并将FLAG_ACTIVITY_NEW_TASK
添加到launchFlags。如果活动的launchFlags包含FLAG_ACTIVITY_NEW_TASK
,它将立即发回取消并让新任务继续正常启动,而不依赖于其创建者。
if (sourceRecord == null) {
// This activity is not being started from another... in this
// case we -always- start a new task.
if ((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
Slog.w(TAG, "startActivity called from non-Activity context; forcing " +
"Intent.FLAG_ACTIVITY_NEW_TASK for: " + intent);
launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
}
} else 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;
}
// ......
if (r.resultTo != null && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
// For whatever reason this activity is being launched into a new
// task... yet the caller has requested a result back. Well, that
// is pretty messed up, so instead immediately send back a cancel
// and let the new task continue launched as normal without a
// dependency on its originator.
Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result.");
r.resultTo.task.stack.sendActivityResultLocked(-1,
r.resultTo, r.resultWho, r.requestCode,
Activity.RESULT_CANCELED, null);
r.resultTo = null;
}
但是在Android 5.x中,这改变如下:
final boolean launchSingleTop = r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP;
final boolean launchSingleInstance = r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE;
final boolean launchSingleTask = r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK;
int launchFlags = intent.getFlags();
if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0 &&
(launchSingleInstance || launchSingleTask)) {
// We have a conflict between the Intent and the Activity manifest, manifest wins.
Slog.i(TAG, "Ignoring FLAG_ACTIVITY_NEW_DOCUMENT, launchMode is " +
"\"singleInstance\" or \"singleTask\"");
launchFlags &=
~(Intent.FLAG_ACTIVITY_NEW_DOCUMENT | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
} else {
switch (r.info.documentLaunchMode) {
case ActivityInfo.DOCUMENT_LAUNCH_NONE:
break;
case ActivityInfo.DOCUMENT_LAUNCH_INTO_EXISTING:
launchFlags |= Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
break;
case ActivityInfo.DOCUMENT_LAUNCH_ALWAYS:
launchFlags |= Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
break;
case ActivityInfo.DOCUMENT_LAUNCH_NEVER:
launchFlags &= ~Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
break;
}
}
final boolean launchTaskBehind = r.mLaunchTaskBehind
&& !launchSingleTask && !launchSingleInstance
&& (launchFlags & Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0;
if (r.resultTo != null && (launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
// For whatever reason this activity is being launched into a new
// task... yet the caller has requested a result back. Well, that
// is pretty messed up, so instead immediately send back a cancel
// and let the new task continue launched as normal without a
// dependency on its originator.
Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result.");
r.resultTo.task.stack.sendActivityResultLocked(-1,
r.resultTo, r.resultWho, r.requestCode,
Activity.RESULT_CANCELED, null);
r.resultTo = null;
}
即使您将launchMode设置为onActivityResult
或singleTask
,这也是{5.}}在Android 5.x中有效的原因。
答案 2 :(得分:6)
@Peter Knego说什么
加
它似乎在5.1中工作,而不是在4.4.4
中意味着onActivityResult会触发
答案 3 :(得分:0)
要阐明一些答案:
startActivityForResult()
结合启动模式singleTask
或singleInstance
无效。 onActivityResult()
将立即被调用,其结果代码为Activity.RESULT_CANCELED
。
startActivityForResult()
有效,但是启动模式singleTask
或singleInstance
基本上被忽略,这意味着该活动被启动到同一任务中,并且未创建新任务。< / p>
如果您要验证此运行adb shell dumpsys activity activities
。我只希望系统至少会向我显示警告。
此更改也反映在@GGCoke具有posted的代码中。
答案 4 :(得分:-1)
我知道这已经很晚了,但你可以对onNewIntent()方法产生OnActivityResult效果,因为这是你的singleTask活动。