通过URL“appname://com.appname/”从Web浏览器打开活动后清除堆栈

我的应用程序有一个活动,它在浏览器中启动oauth授权过程,最后浏览器接收重定向到url“appname://com.appname”,它回调我的活动。 (活动声明可以查看此类url)

一切都很好,但如果用户按下“返回”,他会回到网络浏览器。 我希望在回调活动时清除历史堆栈,以使此活动成为此任务的根和顶部。

我可以在这种情况下使用哪些旗帜或挂钩?


我发现只有一个丑陋的解决方案:接收appname://com.appname urls到特殊的“Gag”活动,它将在其onResume上启动主要活动。

我尝试将主要活动“singleTask”,在新任务中启动浏览器,设置标志NO_HISTORY和EXLUDE_FROM_RECENTS,CLEAR_TOP,设置clearTaskOnLaunch =“true”。 尝试了清单中标志和标签的许多组合 – 没有任何帮助。


我解决了这个问题:
1)在AndroidManifest.xml中设置clearTaskOnLaunch =“true”
2)在新任务中启动浏览器(使用FLAG_ACTIVITY_NEW_TASK),并完成当前活动(以完成当前任务)。
3)覆盖onBackPressed:而不是完成此活动调用moveTaskToBack(true);

当用户按下后 – 任务(浏览器在其根目录)转到后台并且用户看到他的主屏幕。

当用户再次启动应用程序时 – 它从现有实例打开,清除任务并成为它的根(因为clearTaskOnLaunch =“true”)

当在Web浏览器中单击链接appname://com.appname时,浏览器会调用您的活动,但浏览器没有调用完成本身,您无法更改浏览器。

我认为制作一个内部有webview的新活动可以解决这个问题。

您将启动该新活动而不是Android浏览器。 在新活动中,设置webViewClient以导航回主要活动:

wv_mem_rank.setWebViewClient(new WebViewClient() { public boolean shouldOverrideUrlLoading(WebView view, String url) { if(url.startWith("appname://com.appname")) { startActivity(); finish(); } view.loadUrl(url); return true; } public void onLoadResource (WebView view, String url) { } public void onPageFinished(WebView view, String url) { } });