我正在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
似乎对它没有影响。
答案 0 :(得分:0)
您所看到的内容很有意义,因为使用FLAG_ACTIVITY_NO_HISTORY调用浏览器不会从应用程序启动前删除堆栈。