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

时间:2011-05-31 05:37:14

标签: java android browser android-activity

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

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

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


<击> 我发现只有一个丑陋的解决方案: 接收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”)

1 个答案:

答案 0 :(得分:0)

在网络浏览器中点击链接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) {
    }
});