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

时间:2011-02-25 14:42:51

标签: android android-activity single-instance

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

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

5 个答案:

答案 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)

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

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

答案 4 :(得分:0)

Android Source Code

检查“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标志的原因。

More Source Code

检查“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的原因。