28

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

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

4

6 回答 6

50

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

考虑使用 singleTask 代替:

单任务

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

单实例

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

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

于 2011-02-25T15:15:56.770 回答
5

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

于 2012-01-29T09:06:29.627 回答
4

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

于 2011-02-25T15:06:12.107 回答
2

你不能使用singleInstanceor singleTaskwithstartActivityForResult方法。

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

于 2018-02-23T16:06:21.453 回答
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 的原因。

于 2018-04-24T05:25:56.620 回答
0

我的应用程序示例可以使某人受益:

  • 在清单文件中,我的设置是:

<application android:launchMode="singleTask"...>

  • 我使用一个 java 类,仅作为启动器(它不显示活动)。在清单中,它设置为:

<activity android:launchMode="singleTop" ...>

  • 此外,其他活动设置相同:

<activity android:launchMode="singleTop" ...>

当用户将应用程序发送到后台时,通过单击应用程序图标或从后台恢复应用程序,最后启动的 Activity 将保持不变,即使它们都是startActivityForResult()从启动器启动的。

于 2021-08-16T12:41:29.903 回答