zoukankan      html  css  js  c++  java
  • Android 开发进程 0.36 原生与H5交互

    JS调用原生方法

    H5调用Android方法基本有两种,第一步通用的初始化webview

    WebSettings settings = webview.getSettings();
    settings.setJavaScriptEnabled(true); //允许在WebView中使用js
    

    2 创建桥接类,这是第一种方法

    private Context mContext;
    private WebView mWebView;
    public static final String javaInterface= "javaInterface";
    public JavaScriptMethod(Context context, WebView webView) {
        mContext = context;
        mWebView = webView;
    }
    @JavascriptInterface
    public void showToast(String json){
        Toast.makeText(context, json, Toast.LENGTH_SHORT).show();
    }
    

    这种方法就是在JavaScript中直接调用桥接类定义的方法,在初始化webview的同时执行

    JavaScriptMetod m = new JavaScriptMetod(this, webview);
    webview.addJavascriptInterface(m, JavaScriptMetod.javaInterface);
    

    如果现在在 tomcat的webapp下文件夹简单填写一个HTML文件,添加一个按钮并在script标签中添加以下JavaScript方法

      function jscallandroid(){
            var jsondata={"toast":"js调用了Android方法"};
            window.jsInterface.showToast(JSON.stringify(jsondata));
        }
    

    运行tomcat服务,在webview中点击按钮即可执行原生方法。
    第二种方法使用范围更加普遍,如果在javascript的方法中使用以下方式:

       var json = {"data": "I am a toast"};
       window.location.href="protocol://android?code=toast&data="+JSON.stringify(json);
    

    webview会重加载给到的链接,再重写webview类的 shouldOverrideUrlLoading方法可以拦截返回的url,从而做出相应。url应提前规定,如开头写作上文的“protocol://android?”,后面的code和data可以区分请求的方法和传输的数据。如以下实例:

    webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                String pre = "protocol://android";
                if (!url.contains(pre)) {
                    return false;
                }
              //执行过滤
                return true;
            }
        });
    

    setWebViewClient方法返回false是默认不执行过滤,继续加载。返回true则会拦截uri不直接加载。可以使用uri字符串匹配的方法过滤提取code和data
    需注意的是shouldOverrideUrlLoading方法参数为view和url的方法已经弃用,在Lollipop及以上版本不会默认执行,所以需要重写同名的另一个参数为view和request的方法,在重写的方法中调用上述方法。

    Android调用JS方法

    这个使用较少,可以直接使用webview的loadurl方法。如Javascript中已经有以下代码:

     var showMessage=function (json) {
            alert(JSON.stringify(json))
        }
    

    android中(如在点击事件方法中)可以使用:调用js方法需要在主线程中。

    JSONObject json=new JSONObject();
    json.put("alert","loading");
    webView.loadUrl("javascript:showMessage("+json.toString()+")");
    
    吾生也有涯,而知也無涯。以有涯隨無涯,殆已
  • 相关阅读:
    [PHP] class_exists类不存在时会调用__autoload函数
    [Redis] Redis的消息机制- 发布订阅
    [发电] 现在正式入驻爱发电平台
    [MySQL] PHP IP登录限制的实现
    [Redis] 哈希表的Rehash机制
    [Redis] redis的hash类型底层结构哈希表
    [Linux] ls命令的几个常用参数实现按时间/文件大小排序
    [Go] 在gin框架gorm下查询一对多的数据
    [Redis] list底层的数据结构
    [GO]go redis实现滑动窗口限流-redis版
  • 原文地址:https://www.cnblogs.com/baimiyishu/p/15427163.html
Copyright © 2011-2022 走看看