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" οnclick="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处理
}
效果图:
java调用js方法参考JS与Native交互
如果要求更高的安全性,可用第三方组件,详细参考https://github.com/pedant/safe-java-js-webview-bridge
源码:http://yunpan.cn/cm7Qk4JVMuRXT (提取码:64d5)