webview实践

来源:互联网 发布:mysql安装步骤 编辑:程序博客网 时间:2024/05/21 00:46

webview与javascript交互

webView.getSettings().setJavaScriptEnabled(true);        webView.addJavascriptInterface(new ClickModel(this), "js");
第一句为设置与javascripte能够交互,第二句设置交互操作。

这里的ClickModel:
public class ClickModel {    private Context mContext;    public ClickModel(Context context){        this.mContext = context;    }    @JavascriptInterface    public void clicks(){        Toast.makeText(mContext,"click from js",Toast.LENGTH_SHORT).show();    }}
在你提供给JavaScript调用的方法上加上注解@JavascriptInterface。

assets下的input.html:

<Html><head>    <script type="text/javascript" charset="utf-8">        function call(){            js.clicks();        }    </script></head><body>    <input type="button" value="dianji" onclick="call()">    <a href="kedou://com.example.webview.DemoActivity">DemoActivity</a></body></Html>
此处就是点击“dianji"按钮,执行javaScript的call方法。call中调用了由webView.addJavascriptInterface(new ClickModel(this), "js")产生的方法。
这种方式在android 4.2之前webview有远程注入的安全问题,4.2之后google修复了这个问题。那么,在开发中,尽量少用这个方式,推荐用第二种方式,也就是url的方式。

url方式

也就是input.html的body中的<a>的方式。本例中 <a href="kedou://com.example.webview.DemoActivity">DemoActivity</a>,点击这个超链接,目的是要跳到DemoActivity.
在shouldOverrideUrlLoading()方法中处理超链接中的url.

webView.setWebViewClient(new WebViewClient(){            @Override            public boolean shouldOverrideUrlLoading(WebView view, String url) {                Log.e("override_url", url);                if(url.startsWith("kedou://")){                    String temp = url.substring(8);                    try {                        Class desClass = Class.forName(temp);                        startActivity(new Intent(JsActionActivity.this, desClass));                    } catch (ClassNotFoundException e) {                        e.printStackTrace();                    }                    return true; //主应用程序处理                }                view.loadUrl(url);                return super.shouldOverrideUrlLoading(view, url);   //webview处理            }

url处理,反射获取class,然后跳到目标activity,最后要return true,表示有主程序处理。


效果图:



java调用js方法参考JS与Native交互

如果要求更高的安全性,可用第三方组件,详细参考https://github.com/pedant/safe-java-js-webview-bridge

源码:http://yunpan.cn/cm7Qk4JVMuRXT (提取码:64d5)




1 0