android和js相互调用

项目中首页本来是android原生的,后来因为经常改动界面,修改布局,尤其是布局没有事先考虑好,如果用原生的android来开发需要频繁的发包,当然如果事先知道所有布局样式也可以先定义好几套模板,或者通过热修复技术也可以解决。后经过讨论把首页改成h5然后点击h5页面给我们传递参数,我们把js给我们的值传递给自己原生的界面,这样即使首页界面需要小调整我们也不需要发布。如果界面中有刷新或者加载更多,就需要android去调用js的方法,下面简单说下这两种是如何调用:


先给大家介绍一个封装比较好的webview:https://github.com/Justson/AgentWeb

还有腾讯的VasSonic:https://github.com/Tencent/VasSonic (专注提升h5首屏加载速度)

如果大家对以上比较感兴趣的可以参考:AgentWeb+VasSonic实现h5首页加速

如果只是想了解android和js是如何交互的请直接向下



最常见的是js调用android方法,js代码

function callAndroid(){
	nativeMethod.pointsListLoaded("js传递给android的一个json字符串");
}


那android端该如何支持呢

如果网页是https的,请参考这里:http://blog.csdn.net/qq_33220645/article/details/76906396

如果有databinding不清楚的可以参考这里:http://blog.csdn.net/qq_33220645/article/details/76080898

http://blog.csdn.net/qq_33220645/article/details/76084532


//启用支持javascript
        WebSettings settings = bindingView.mwebview.getSettings();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);//https加载WebView图片不显示问题
        }
        settings.setJavaScriptEnabled(true);
        bindingView.mwebview.loadUrl(url);
        bindingView.mwebview.getSettings().setDomStorageEnabled(true);
        /**
         * 让webview长按不能复制
         */
        bindingView.mwebview.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                return true;
            }
        });
        /**
         * 信任证书
         */
        bindingView.mwebview.setWebViewClient(new WebViewClient() {
            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                handler.proceed();//https的网页需要安装证书,或者信任证书才能访问
//                super.onReceivedSslError(view, handler, error);
            }

            @Override
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                super.onReceivedError(view, request, error);
//                showError();
            }
        });
//        webView.getSettings().setDatabaseEnabled(true);
        //覆盖WebView默认使用第三方或系统默认浏览器打开网页的行为,使网页用WebView打开

        //优先使用缓存
//        webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        //不使用缓存
        bindingView.mwebview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
        bindingView.mwebview.addJavascriptInterface(new ClickResult(), "nativeMethod");


/**
     * js点击事件处理
     */
private class ClickResult {  
        /**
         * 积分明细数据加载完成
         *
         * @param result
         * @return
         */
        @JavascriptInterface
        public String pointsListLoaded(String result) {//如果什么参数都不需要传递给android可以随便传递一个参数,android不拿就好否则会报错
            analysisJson(result);//解析js传递的result跳转页面
            return null;
        }
}





下面是android数据加载完成告诉js数据加载完成,或者界面中有分页加载,需要加载下一页调用js方法

android代码如下:

bindingView.mwebview.loadUrl("javascript:getPointsList("android给js传递的值")");

js代码:

function getPointsList(param) {
	alert(param);
	document.getElementById('fromJS').innerHTML="我是android调用JS的方法";
	showToast();
	document.getElementById('fromJS').innerHTML=param;
				
}


当然js可以把所有方法放到本地集合中


那android也应该配合调用:

bindingView.mwebview.loadUrl("javascript:javascriptMethods.getPointsList()");

webview相关属性设置解释:



参考文章:http://blog.csdn.net/jdsjlzx/article/details/51376739

http://blog.csdn.net/Master_Miku/article/details/54913628

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值