如果活动的启动模式为singleInstance,则不会触发onActivityResult

我有一个Activity,它基本上是我的主要活动,它的启动模式是单个实例。 但由于singleInstance, onActivityResult()回调不会触发。 如果我将清单文件中的启动模式更改为任何其他模式,它可以正常工作。

你能解释为什么这个回调不起作用吗?

Solutions Collecting From Web of "如果活动的启动模式为singleInstance,则不会触发onActivityResult"

我认为问题在于singleInstance不会让被调用者活动与调用者在同一个任务中存在,因此它无法将值返回给调用者。

考虑使用singleTask:

singleTask

系统在新任务的根目录下创建活动,并将意图路由到该任务。 但是,如果活动的实例已存在,则系统会通过调用其onNewIntent()方法将意图路由到现有实例,而不是创建新实例。

singleInstance

与“singleTask”相同,但系统不会在持有实例的任务中启动任何其他活动。 活动始终是其任务的唯一成员。

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

如果活动是singleInstance ,它将是任务中唯一的活动,因此它始终是任务的顶部。 因此,当您调用startActivityForResult ,它将立即触发回调方法。

“ singleInstance ”活动不允许其他任何活动成为其任务的一部分。 这是任务中唯一的活动。 如果它启动另一个活动,则该活动将分配给另一个任务。 活动始终是其任务的唯一成员。
我认为onActivityResult不适用于singleInstance

您不能将singleInstancesingleTaskstartActivityForResult方法一起使用。

标准模式或singleTop启动模式将解决问题。

Android源代码

检查“ActivityStarter.computeLaunchingTaskFlags()”方法:

  } else if (mSourceRecord.launchMode == 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. mLaunchFlags |= FLAG_ACTIVITY_NEW_TASK; 

这就是为什么在使用单实例启动模式的原始活动时添加NEW_TASK标志的原因。

更多源代码

检查“ActivityStarter.sendNewTaskResultRequestIfNeeded()”方法:

  if (sourceStack != null && (mLaunchFlags & 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."); sourceStack.sendActivityResultLocked(-1 /* callingUid */, mStartActivity.resultTo, mStartActivity.resultWho, mStartActivity.requestCode, RESULT_CANCELED, null /* data */); 

这就是FLAG_ACTIVITY_NEW_TASK总是立即返回RESULT_CANCELED的原因。