我有一个活动,它基本上是我的主要活动,它的启动模式是单实例。但是由于 singleInstance,onActivityResult()
回调不会触发。如果我将清单文件中的启动模式更改为任何其他模式,它就可以正常工作。
你能解释为什么这个回调不起作用吗?
我有一个活动,它基本上是我的主要活动,它的启动模式是单实例。但是由于 singleInstance,onActivityResult()
回调不会触发。如果我将清单文件中的启动模式更改为任何其他模式,它就可以正常工作。
你能解释为什么这个回调不起作用吗?
我认为问题在于 singleInstance 不允许被调用者活动与调用者存在于同一任务中,因此它无法将值返回给调用者。
考虑使用 singleTask 代替:
单任务
系统在新任务的根部创建活动并将意图路由到它。但是,如果活动的实例已经存在,系统会通过调用其 onNewIntent() 方法将意图路由到现有实例,而不是创建一个新实例。
单实例
与“singleTask”相同,只是系统不会在持有该实例的任务中启动任何其他活动。活动始终是其任务的唯一且唯一的成员。
http://developer.android.com/guide/topics/manifest/activity-element.html
如果一个活动是singleInstance
,它将是任务中唯一的一个,因此它始终是任务的顶部。所以当你调用startActivityForResult
它时,它会立即触发回调方法。
“ singleInstance ”活动不允许其他活动成为其任务的一部分。这是任务中的唯一活动。如果它启动另一个活动,则该活动将分配给不同的任务。活动始终是其任务的唯一且唯一的成员。
我认为onActivityResult
不会与singleInstance
你不能使用singleInstance
or singleTask
withstartActivityForResult
方法。
标准模式或 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()
从启动器启动的。