一般来说,比较成熟的公司,android的native开发和webview中内嵌的web页面开发是分离的。Android可以使用webview来呈现web端的页面效果,在app设计的时候,适当情况下使用webView是一种轻耦合的页面展现。
1.webView和javascript的交互:
(1)web执行native代码,示例:
private class MyJavaScript{
public void setText(String data) {
//TODO add your code here
}
}
//将这个接口在webview中进行注册:
MyJavaScript javaScript = new MyJavaScript();
//此处的 "js" 为任意字符串,是在html中调用时引用
webView.addJavascriptInterface(javaScript, "js");
//在html中定义js代码
//关键是代码: javascript:window.jd.setText('sth') "js" 为上述注册的 MyJavaScript 的引用名
//这里将调用上述 java 代码中 MyJavaScript 中的 getText(String data) 方法,从而达到 web 向 native 主动传值的方法
<input id="test1" type="text" οnclick="javascript:window.js.setText('hello word')" value="hello world"/>
(2)native调用js改变web页面元素
//在 html 中定义用具接收 native 传值调用的 js
<script language="javascript" type="text/javascript">
function setText(text){
document.getElementById('sth').value=text;
}
</script>
//在 native 中主动调用执行上述的 js
webView.loadUrl("javascript:setText('hello world')");
2.webView拦截特殊url.
可以根据不同的uri的schema做不同处理,例如识别出camera://,调用手机的相机功能进行拍照。示例如下:
webView.setWebViewClient(new WebViewClient() {
/**
* 返回true阻止浏览器处理
*/
private boolean checkUrl(String url) {
Uri uri = Uri.parse(url);
String schema = uri.getScheme();
if(schema.contains("camera"){
//TODO
return true;
}
return false;
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (checkUrl(Uri.parse(url))) {
return true;
} else {
return super.shouldOverrideUrlLoading(view, url);
}
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
if (checkUrl(Uri.parse(url))) {
webView.stopLoading();
return;
}
super.onPageStarted(view, url, favicon);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, final String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
}
});