【问题标题】:onActivityResult do not fire if launch mode of activity is singleInstance如果活动的启动模式为 singleInstance,则不会触发 onActivityResult
【发布时间】:2011-02-25 14:42:50
【问题描述】:

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

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

【问题讨论】:

    标签: android android-activity single-instance


    【解决方案1】:

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

    考虑使用 singleTask 代替:

    单任务

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

    singleInstance

    与“singleTask”相同,除了 系统不启动任何其他 活动成任务举行 实例。活动始终是 其任务的唯一成员。

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

    【讨论】:

    • 如果onActivityResult 依赖于让父母和孩子在同一个任务中,那不应该在某处记录吗?我正在处理通过onActivityResult wtf 调用的间歇性故障。
    • 我不相信这是正确的,我试过了,SingleTask 完成后没有触发 onActivityResult。这个 StackOverflow 似乎表明了同样的事情:stackoverflow.com/questions/8960072/…
    • @jt-gilkeson 您链接到的问题是关于 target Activity 的启动模式(即:您要启动的那个。OP 的问题是谈论调用Activity的启动模式(即:调用startActivityForResult()的那个)。这个答案是正确的,因为Activity的启动模式singleTask可以 将其他活动启动到其任务中(但启动模式为 singleInstance 的 Activity 不能)。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        您不能将singleInstance 或singleTask 与startActivityForResult 方法一起使用。

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

        【讨论】:

          【解决方案5】:

          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。

          【讨论】:

            【解决方案6】:

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

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

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

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

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

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

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-04-17
              • 1970-01-01
              • 1970-01-01
              • 2013-09-17
              • 2011-04-01
              • 1970-01-01
              相关资源
              最近更新 更多