android 混合开发之与js交互
16lz
2021-01-23
Android 与WebView与Js进行交互
1、优缺点:快速迭代,一套代码可以适配Android、IOS和Web前端,缺点是性能对比原生来说偏低。
2、完成网页加载,基本需要以下步骤:
(1)、webView相关配置
(2)、加载loading
(3)、android与js互调,涉及到android调用js方法和js调用android方法。
(4)、防止WebView内存泄露
3、各步骤实施如下:
(1)webview的配置,一般都是封装一个类,这样全局可以使用,减少代码量,代码如下:
public class X5WebView extends WebView {TextView title;private WebViewClient client = new WebViewClient() { /** * 防止加载网页时调起系统浏览器 */ public boolean shouldOverrideUrlLoading(WebView view, String url) { if( url.startsWith("http:") || url.startsWith("https:") ) { view.loadUrl(url); return true; } else return true; } //view.loadUrl(url); //return true;};@SuppressLint("SetJavaScriptEnabled")public X5WebView(Context arg0, AttributeSet arg1) { super(arg0, arg1); this.setWebViewClient(client); // this.setWebChromeClient(chromeClient); // WebStorage webStorage = WebStorage.getInstance(); initWebViewSettings(); this.getView().setClickable(true);}private void initWebViewSettings() { WebSettings s = this.getSettings(); s.setJavaScriptEnabled(true); s.setJavaScriptCanOpenWindowsAutomatically(true); s.setAllowFileAccess(true); s.setLayoutAlgorithm(LayoutAlgorithm.NARROW_COLUMNS); s.setSupportZoom(false); s.setBuiltInZoomControls(false); s.setUseWideViewPort(true); s.setSupportMultipleWindows(true); // s.setLoadWithOverviewMode(true); s.setAppCacheEnabled(true); // s.setDatabaseEnabled(true); s.setDomStorageEnabled(true); s.setGeolocationEnabled(true); s.setAppCacheMaxSize(Long.MAX_VALUE); // s.setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY); s.setPluginState(WebSettings.PluginState.ON_DEMAND); // s.setRenderPriority(WebSettings.RenderPriority.HIGH); s.setCacheMode(WebSettings.LOAD_NO_CACHE); s.setLayoutAlgorithm(LayoutAlgorithm.NARROW_COLUMNS); s.setLoadWithOverviewMode(true); s.setSavePassword(true); s.setSaveFormData(true); s.setDomStorageEnabled(true); // this.getSettingsExtension().setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY);//extension // settings 的设计} }
2、加载loading,我们在布局中使用的控件是progressbar,根据需求设置在相应的位置,一般放置在webview的上面,加载进度条代码如下。
/** * 给webview设置加载进度条 */ webView.setWebChromeClient(new WebChromeClient() { @Override public void onProgressChanged(WebView webView, int i) { super.onProgressChanged(webView, i); if (i == 100) { progressBar.setVisibility(View.GONE); } else { progressBar.setVisibility(View.VISIBLE); progressBar.setProgress(i); } } });
3、android 与js互调。
这里注意点:我们必须先加载网页,后面在互相调用(必须先有载体)。
加载本地的网页的代码如下:
webView.loadUrl("file:///android_asset/web/index.html"); //加载网页
(1)js调用Android端,代码如下,WebFunction类是封装的所有js调用的方法:
webView.addJavascriptInterface(new WebFunction(), "irootech")
WebFunction类中代码如下:
/** * js调用android */public class WebFunction { //这个是js调用android,给我传递参数。参数是相互定义好的 @JavascriptInterface public void getData(String params, String isAnalyse) { //js返回的数据是sql的入参 if (isAnalyse.equals("true")) { chartsActivityPresenter.getAnalyseChartsData(params); } else if (isAnalyse.equals("false")) { try { String result = new JSONObject(params).getString("query"); JSONObject jsonObject = new JSONObject(result); chartsActivityPresenter.getSqlData(jsonObject); } catch (JSONException e) { e.printStackTrace(); } } }}
(2)Android 调用js中的方法
//这里android 调用js ,通过loadurl,调用js的createChart(),如果传参就定义好,如果不传就直接调用。webView.loadUrl("javascript:createChart( “参数”)");
4、防止webView内存泄露方案:
核心:让onDetachedFromWindow先走,在主动调用destroy()之前,把webview从它的parent上面移除掉。
https://www.jianshu.com/p/3e8f7dbb0dc7
更多相关文章
- 获取Android的Java源代码并在Eclipse中关联查看的最新方法
- Android webkit image的加载过程解析(二)
- 在代码中实现android:tint效果
- 【Android 开发】: Android 消息处理机制之二: Message 中 obtai
- pandaboard ES学习之旅——4 Android源代码下载与编译
- Android实现插件化(热加载)和插件加密
- 使用ProgressBar实现加载进度条
- android百度地图标记点代码
- 【Android】Android WebView 网页输入框获取焦点