【问题标题】:Running code on URL change (custom scheme) without launching new activity在不启动新活动的情况下运行 URL 更改(自定义方案)代码
【发布时间】:2012-01-23 02:05:28
【问题描述】:

我使用意图过滤器为我的应用设置了自定义 URL 方案。当我的 WebView 中的 URL 更改为我的自定义方案 (mockup://pagechange) 时,意图过滤器会正确过滤我的应用程序的意图,从而启动我的活动的新实例。然而,我真正想要的是让意图过滤器在现有活动中运行一段代码,而不是启动一个新活动。这可能吗,如果可以,我该如何设置?如果没有,当我的 WebView 中的 URL 更改为以 'mockup' 开头的任何内容时,关于如何完成运行代码任务的任何其他想法?

我尝试在意图过滤器中使用其他操作,但我尝试过的操作(RUN 和 ATTACH_DATA)导致当 url 更改时,我的 WebView 中显示“网页不可用”页面。此外,我在这里找到的所有意图过滤器/自定义方案问题都涉及弄清楚如何使用带有自定义方案的 url 启动新活动 - 使得很难搜索相反的内容。

谢谢!

【问题讨论】:

    标签: android android-intent android-webview


    【解决方案1】:

    首先,在清单中添加android:launchMode="singleTop" 您的活动声明。在您的意图中使用标志FLAG_ACTIVITY_CLEAR_TOP。您将在 onNewIntent() 回调中获得意图。

    请记住,在 onNewIntent() 中传递的意图与在 getIntent() 中返回的意图不同。如果您在代码的其他部分使用 getIntent(),请在 onNewIntent() 的意图上使用 setIntent。

    【讨论】:

    • launchMode 选项当然看起来像我想要做的(不启动 Activity 的新实例,而只是调用一个方法 - 在这种情况下为 onNewIntent())。但是我会在哪里设置标志?我没有明确地创建一个新活动,我试图将我的 WebView 上的 URL 更改为自定义方案的动作 - 从未在代码中实际设置 Intent 对象。
    • 你当然是对的。只需创建一个新活动,其唯一目的是启动其他活动。因此,在新的 Activity 中,不显示任何 UI,只需在处理完 Intent 后调用 startActivity 并将其转发到您的单个顶部 Activity。
    【解决方案2】:

    我最终放弃了意图过滤器模式 - 我已经为我的 WebView 设置了一个 WebViewClient 来处理在我的 WebView 中加载外部链接,所以我只需在其中设置一个标志来运行我的代码,如果 URL 是正在加载包含我正在寻找的自定义方案:

    WebView wv = (WebView) findViewById(R.id.app_container);
    // [other setup]
    wv.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url)
            {
                if(!url.contains("mockup://"))
                    view.loadUrl(url);
                else {
                    // run "mockup"-specific code
                }
                return true;
            }
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-07
      • 1970-01-01
      • 2014-10-18
      • 2011-11-11
      • 2020-12-23
      • 2015-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多