2

我正在 Android 中实现 oauth 登录,但我被困在一个点上。我需要重定向到本机浏览器以启动登录(而不是使用我自己的嵌入式 WebView),但这会导致后台堆栈出现问题。我的目标很简单:在重定向后返回我的活动,在后台堆栈中没有本机浏览器的痕迹。这是迄今为止我最接近的:

要从我的活动中启动登录,我使用:

    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
    intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY
        | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
    context.startActivity(intent);

我有一个单独的活动来接收返回重定向并处理其余的登录过程。我真的不在乎它是否是一个单独的活动,这只是我目前的解决方案。在它的清单中我设置了android:noHistory="true". 完成登录过程后,我尝试使用如下代码返回第一个活动:

    Intent intent = new Intent(context, OrigActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    context.startActivity(intent);

但是,这最终会创建原始活动的第二个副本,当我按下它时,它会返回到第一个副本。换句话说,它似乎并不尊重FLAG_ACTIVITY_CLEAR_TOP。尽管我进行了所有的搜索,但我是否错过了一些简单的让它工作的东西?或者我还有其他方法可以解决所有这些问题吗?

编辑:事实证明,问题源于浏览器是在单独的任务中启动的。来自一些 Android 文档:

...如果您的应用程序发出打开 Android 浏览器的意图,则其活动不会与您的应用程序放在同一任务中。相反,要么为浏览器启动一个新任务,要么,如果浏览器已经有一个任务在后台运行,则该任务被提出来处理新的意图。

如果我将原始活动的启动模式设置为singleTask正确地将其带到前台而不是创建新副本,但会出现新问题。浏览器现在位于我所有活动的后台,所以现在它似乎FLAG_ACTIVITY_NO_HISTORY没有受到尊重。我不确定这是否让我更接近正确的解决方案......

编辑 2:更正:如果浏览器在我启动之前没有运行,那么一切正常。但是,如果它已经在运行FLAG_ACTIVITY_NO_HISTORY似乎对它没有影响。

4

1 回答 1

0

您所看到的内容是有道理的,因为使用 FLAG_ACTIVITY_NO_HISTORY 调用浏览器不会从 PRIOR 到您的应用程序开始删除返回堆栈。

于 2014-05-16T06:21:38.080 回答