我正在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似乎对它没有任何影响。
发布于 2014-05-16 06:21:38
您所看到的是有意义的,因为使用FLAG_ACTIVITY_NO_HISTORY调用浏览器不会在应用程序启动之前删除回堆栈。
https://stackoverflow.com/questions/14843915
复制相似问题