记录一下前面混合开发时很重要的java与js互调方法进行数据交互。javascript
混合开发就须要webview这个控件了html
这就很玄学了,哈哈哈java
这篇文章https://www.jianshu.com/p/3d9a93c9fea2能够看看android
先来设置一下webview。WebSettings用于管理WebView状态配置git
public static boolean WebViewSetting(Activity activity, WebView webview) { final WebSettings webSettings = webview.getSettings(); webSettings.setDomStorageEnabled(true);// 主要是这句
webSettings.setJavaScriptEnabled(true);// 启用js
webSettings.setBlockNetworkImage(false);// 解决图片不显示
webSettings.setSavePassword(false); webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式
webSettings.getSettings().setBuiltInZoomControls();//设置是否支持缩放
webSettings.addJavascriptInterface(obj,str);//向html页面注入java对象
webSettings.setUseWideViewPort(true);//设置此属性,可任意比例缩放
webSettings.setLoadWithOverviewMode(true);// 页面支持缩放:
webSettings.setJavaScriptEnabled(true); webSettings.setBuiltInZoomControls(true); webUrl.requestFocusFromTouch(); //若是webView中须要用户手动输入用户名、密码或其余,则webview必须设置支持获取手势焦点。
webSettings.setJavaScriptEnabled(true); //支持js
webSettings.setUseWideViewPort(false); //将图片调整到适合webview的大小
webSettings.setSupportZoom(true); //支持缩放 webSettings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); //支持内容从新布局
webSettings.supportMultipleWindows(); //多窗口
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //关闭webview中缓存
webSettings.setAllowFileAccess(true); //设置能够访问文件
webSettings.setNeedInitialFocus(true); //当webview调用requestFocus时为webview设置节点
webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持经过JS打开新窗口
webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小
webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片 // 让JavaScript能够自动打开windows设置容许JS弹窗
webSettings.setJavaScriptCanOpenWindowsAutomatically(true); // 设置缓存
webSettings.setAppCacheEnabled(false); // 设置缓存模式,一共有四种模式 // webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); // 设置缓存路径
webSettings.setAppCachePath(""); // 支持缩放(适配到当前屏幕)
webSettings.setSupportZoom(true); // 将图片调整到合适的大小
webSettings.setUseWideViewPort(true); // 支持内容从新布局,一共有四种方式 // 默认的是NARROW_COLUMNS
webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); // 设置默认字体大小
webSettings.setDefaultFontSize(12); // 支持缩放
webSettings.setSupportZoom(false); //设置支持两指缩放手势
webSettings.setBuiltInZoomControls(false); return true; }
下面重要的来了github
addJavascriptInterface是WebKit的原生API,属于WebView对象的公共方法,用于暴露一个java对象给js,使得js能够直接调用方法。web
因为它不安全,4.2后新增了@JavascriptInterface注解windows
还有个框架:https://github.com/lzyzsd/JsBridge ---这个项目在Java和JavaScript之间架起了桥梁。浏览器
如今要开始加载页面了 webview.loadUrl("https://www.baidu.com/");缓存
@SuppressLint("JavascriptInterface") private void initMixedPage() { //封装webview
NativeWebViewUtil nativeWebViewUtil = new NativeWebViewUtil(); nativeWebViewUtil.WebViewSetting(this,webview); //添加Javascript的映射
webview.addJavascriptInterface(this,"android"); webview.loadUrl("https://www.baidu.com"); webview.setWebViewClient(new WebViewClient(){ @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); // 加载页面
} @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); // 加载结束
webview.evaluateJavascript("javascript:get_android_base("aaa")", new ValueCallback<String>() { @Override public void onReceiveValue(String value) { //此处为 js 返回的结果
Log.v("Native",value); } }); } }); }
没有回掉能够写null.
有两个很重要的方法setWebChromeClient和setWebClient
setWebChromeClient主要处理解析,渲染网页等浏览器作的事情
WebChromeClient是辅助WebView处理Javascript的对话框等
要调用js就要等webview加载完成后再调用js方法
webview.setWebViewClient(new WebViewClient(){ @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); // 加载页面
} @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); // 加载结束js 方法 get_android_base
webview.evaluateJavascript("javascript:get_android_base("aaa")", new ValueCallback<String>() { @Override public void onReceiveValue(String value) { //此处为 js 返回的结果
Log.v("Native",value); } }); } });
javascript代码
接收android发来的数据
function get_android_base(base){ alert(base); }
javascrip代码
js的一个方法 get_data()
window.android.get_data("mcontrol");
Android代码
@JavascriptInterface public void get_data(String base){ Log.d(TAG,base); }
到这里,简单的互调就完成了。
互调就很玄学,老是有各类各样的问题哈哈哈。
后面再记录下腾讯的webview