zoukankan      html  css  js  c++  java
  • js交互

     Js和native交互的方法与问题

    实现JS和Native交互有两种方式:

    第一种:shouldOverrideUrlLoading(WebView view, String url)

    通过给WebView加一个事件监听对象(WebViewClient)并重写shouldOverrideUrlLoading(WebView view, String url)方法。当按下某个连接时WebViewClient会调用这个方法,并传递参数view和url

    第二种:JS和Java互调

    WebView开启JavaScript脚本执行

    WebView设置供JavaScript调用的交互接口

    客户端和网页端编写调用对方的代码

    JS调用JAVA            

    JS : window.jsInterfaceName.methodName(parameterValues)

    native: webView.addJavascriptInterface(new JsInteration(), “androidNative”);

    Java调用JS

    webView调用js的基本格式为:

           webView.loadUrl(“javascript:methodName(parameterValues)”)

    调用js无参无返回值函数:

    String call =“javascript:sayHello();webView.loadUrl(call);

    调用js有参无返回值函数:

    String call = “javascript:alertMessage(”” + “content” + “”)”;

    webView.loadUrl(call);

    调用js有参数有返回值的函数

    Android在4.4之前并没有提供直接调用js函数并获取值的方法,所以在此之前,常用的思路是 java调用js方法,js方法执行完毕,再次调用java代码将值返回。Android 4.4之后使用evaluateJavascript即可。

    private void testEvaluateJavascript(WebView webView) {

      webView.evaluateJavascript("getGreetings()", new ValueCallback<String>() {

      @Override

      public void onReceiveValue(String value) {

          Log.i(LOGTAG, "onReceiveValue value=" + value);

      }});

    }

    注:

    参数类型如果是简单的int或String,可以直接传,对于复杂的数据类型,建议以字符串形式的json返回。

    evaluateJavascript方法必须在UI线程(主线程)调用,因此onReceiveValue也执行在主线程。

    当native与js交互时存cookie看到很多人遇到过这样一个问题,cookie存不进去,网上有很多解释方案,但是很多没说到重点上,这里直接贴一下代码:

    public static void synCookies(Context context, String url, String version) {

            CookieSyncManager.createInstance(context);

            CookieManager cookieManager = CookieManager.getInstance();

            cookieManager.setAcceptCookie(true);

            cookieManager.removeAllCookie();

            cookieManager.setCookie(url, "sessionKey="+UserInfoShareprefrence.getInstance(context).getLocalSessionKey())

            cookieManager.setCookie(url, "productVersion=android一epocket一v" + version);

            CookieSyncManager.getInstance().sync();

        }

    存不进去的很大一部分原因是你的url不对 ,这里的url就是显示的url的域名,这里顺便贴出取域名的方法,给出的是通过正则提取域名

     /**

         * 获得域名

         * @param url

         * @return

     */

    public static String getDomain(String url) {

            Pattern p = Pattern.compile("[^//]*?\.(com|cn|net|org|biz|info|cc|tv)", Pattern.CASE_INSENSITIVE);

            Matcher matcher = p.matcher(url);

            matcher.find();

            return matcher.group();

        }

    还有一点就是,如果你想传递多个值给cookie的话,可以多次使用setCookie,不要擅自的自己拼值,因为你拼的字符串中可能存在分号,内部多分号做了特殊处理,截取分号之前的,之后的直接放弃!

  • 相关阅读:
    ASP.NET MVC 音乐商店 目录
    ASP.NET MVC 音乐商店 9. 注册和结账
    SQL查询入门(下篇)
    【译】Asp.net MVC并不仅仅只是Linq to SQL
    SQL查询入门(中篇)
    【译】利用.LESS来提高CSS
    Silverlight 入门学习笔记(1)Silverlight是什么
    【译】详解Asp.net MVC DropDownLists
    Asp.net缓存简介
    SQL查询入门(上篇)
  • 原文地址:https://www.cnblogs.com/fanlinqiang/p/7902576.html
Copyright © 2011-2022 走看看