我有一个Activity,它基本上是我的主要活动,它的启动模式是单个实例。但由于singleInstance,onActivityResult()
回调不会触发。如果我将清单文件中的启动模式更改为任何其他模式,它可以正常工作。
你能解释为什么这个回调不起作用吗?
答案 0 :(得分:47)
我认为问题在于singleInstance不会让被调用者活动与调用者存在于同一个任务中,因此它无法将值返回给调用者。
请考虑使用singleTask:
<强> singleTask 强>
系统在该处创建活动 一个新任务的根和路由 意图。但是,如果是一个实例 该活动已经存在, 系统将意图路由到现有 实例通过调用它 onNewIntent()方法,而不是 创造一个新的。
<强> singleInstance 强>
与“singleTask”相同,除了 系统不会启动任何其他 活动进入任务持有 实例。活动始终是 单一且唯一的任务成员。
http://developer.android.com/guide/topics/manifest/activity-element.html
答案 1 :(得分:5)
如果活动是singleInstance
,它将是任务中唯一的活动,因此它始终是任务的首要任务。因此,当您调用startActivityForResult
时,它将立即触发回调方法。
答案 2 :(得分:4)
“singleInstance”活动,不允许任何其他活动成为其任务的一部分。这是任务中唯一的活动。如果它启动另一个活动,则该活动将分配给另一个任务。活动始终是其任务的唯一成员
我认为onActivityResult
不适用于singleInstance
答案 3 :(得分:0)
您不能将singleInstance
或singleTask
与startActivityForResult
方法一起使用。
标准模式或singleTop启动模式将解决问题。
答案 4 :(得分:0)
检查“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的原因。