【发布时间】:2011-02-25 14:42:50
【问题描述】:
我有一个 Activity,它基本上是我的主要 Activity,它的启动模式是单实例。但是由于 singleInstance,onActivityResult() 回调不会触发。如果我将清单文件中的启动模式更改为任何其他模式,它就可以正常工作。
你能解释一下为什么这个回调不起作用吗?
【问题讨论】:
标签: android android-activity single-instance
我有一个 Activity,它基本上是我的主要 Activity,它的启动模式是单实例。但是由于 singleInstance,onActivityResult() 回调不会触发。如果我将清单文件中的启动模式更改为任何其他模式,它就可以正常工作。
你能解释一下为什么这个回调不起作用吗?
【问题讨论】:
标签: android android-activity single-instance
我认为问题在于 singleInstance 不允许被调用者活动与调用者存在于同一任务中,因此它无法将值返回给调用者。
考虑使用 singleTask 代替:
单任务
系统在 新任务的根并路由 意图它。但是,如果一个实例 的活动已经存在, 系统将意图路由到现有的 通过调用它的实例 onNewIntent() 方法,而不是 创建一个新的。
singleInstance
与“singleTask”相同,除了 系统不启动任何其他 活动成任务举行 实例。活动始终是 其任务的唯一成员。
http://developer.android.com/guide/topics/manifest/activity-element.html
【讨论】:
onActivityResult 依赖于让父母和孩子在同一个任务中,那不应该在某处记录吗?我正在处理通过onActivityResult wtf 调用的间歇性故障。
Activity 的启动模式(即:您要启动的那个。OP 的问题是谈论调用Activity的启动模式(即:调用startActivityForResult()的那个)。这个答案是正确的,因为Activity的启动模式singleTask可以 将其他活动启动到其任务中(但启动模式为 singleInstance 的 Activity 不能)。
如果一个活动是singleInstance,它将是任务中唯一的一个,因此它始终是任务的顶部。所以当你调用startActivityForResult时,它会立即触发回调方法。
【讨论】:
“singleInstance”活动不允许其他活动成为其任务的一部分。这是任务中的唯一活动。如果它启动另一个活动,则该活动将分配给不同的任务。活动始终是其任务中唯一且唯一的成员。
我认为onActivityResult 不适用于singleInstance
【讨论】:
您不能将singleInstance 或singleTask 与startActivityForResult 方法一起使用。
标准模式或 singleTop 启动模式将解决问题。
【讨论】:
检查“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。
【讨论】:
我的应用示例可以使某人受益:
<application android:launchMode="singleTask"...>
<activity android:launchMode="singleTop" ...>
<activity android:launchMode="singleTop" ...>
当用户将应用程序发送到后台时,通过单击应用程序图标或从后台恢复应用程序,最后启动的 Activity 将保持不变,即使它们都是从启动器以 startActivityForResult() 启动的。
【讨论】: