记录webview与js交互

来源:互联网 发布:plsql 两个数据库导表 编辑:程序博客网 时间:2024/06/05 02:48

        • 首先要设定可交互
        • h5通过js调用android的java代码
          • 特别注意h5调用android的方法若是要执行UI操作考虑因为不在一个线程要使用post new Runnable run
        • android 调用 js 中的无参方法wave
        • android 调用 js 中的有参方法ExecuteFunc参数类型是String 要注意传参的时候要引号
        • 诸多设置
        • webview拦截back事件的坑
        • WebViewClientWebChromeClient 之间各自用途
        • 同步java和h5的cookie
        • 从h5获取webview标题

追加:WebView你真的熟悉吗?看了才知道(http://www.jianshu.com/p/d2f5ae6b4927)
在这里有个总结帖子很好.
webview遇到的那些坑与解决方法(http://blog.csdn.net/dsc114/article/details/52440080)

大头鬼有一个开源项目:JsBridge(https://github.com/lzyzsd/JsBridge) 应该读一下.

首先要设定可交互:

mWebView.getSettings().setJavaScriptEnabled(true);

h5通过js调用android的java代码:

mWebView.addJavascriptInterface(this, "jSInterface");// jSInterface 是H5调用安卓的实体名称

this指的是当前类,这里有被h5调用的接口方法,被js调用的接口方法前面加 @JavascriptInterface 注解。接口方法的参数需要告知做h5开发的人员。h5中调用java的实例名称jSInterface需要由h5开发人员告知客户端开发人员。

特别注意:h5调用android的方法,若是要执行UI操作,考虑因为不在一个线程,要使用post (new Runnable() { run….})

android 调用 js 中的无参方法wave:

mWebView.loadUrl("javascript:wave()");

android 调用 js 中的有参方法ExecuteFunc(参数类型是String), 要注意传参的时候要引号:

mWebView.loadUrl("javascript:ExecuteFunc(\"" + jsonString + "\")");

关于引号这一点,之前百度搜出来网上的例子都是无参调用,慕课网这篇手记中恍然大悟,写的很详细,推荐:Android中Java和JavaScript交互

诸多设置:

//进度条监听mWebView.setWebChromeClient(new WebChromeClient(){          @Override          public void onProgressChanged(WebView view, int progress){              JSAndroidActivity.this.setTitle("Loading...");              JSAndroidActivity.this.setProgress(progress);              if(progress >= 80) {                  JSAndroidActivity.this.setTitle("JsAndroid Test");              }          }      });  //拦截系统的onBack键mWebView.setOnKeyListener(new View.OnKeyListener() {        // webview can go back          @Override          public boolean onKey(View v, int keyCode, KeyEvent event) {              if(keyCode == KeyEvent.KEYCODE_BACK && mWebView.canGoBack()) {                  mWebView.goBack();                  return true;              }              return false;          }      });  

webview拦截back事件的坑

webview拦截onBack事件有个坑, 若H5本身只有1个页面,本身是不需要拦截back事件的,若做了拦截,可能引起在别处打开webview时,回退会显示上一个地方的url地址.所以在打开新的地址(loadUrl)前, 需要清一下webview的缓存,调用mWebview.clearCache(boolean includeDiskFiles)没有用,因为在back时,webview是根据url的历史记录重新加载回退的, 所以需要调用mWebview.clearHistory()方法.调用时机建议在onPageFinished方法中,即页面加载完毕时,若在loadUrl之前清历史,仍会有1次残留.

mWebView.setWebViewClient(new WebViewClient() { //只让本应用程序的webview加载网页,不调用外部浏览器        @Override        public boolean shouldOverrideUrlLoading(WebView view, String url) {            view.loadUrl(url);            return true;        }        @Override        public void onPageFinished(WebView view, String url) {            super.onPageFinished(view, url);            mWebView.clearHistory();//if need.        }    });

WebViewClient、WebChromeClient 之间各自用途

tips : 简述 WebView、WebViewClient、WebChromeClient 之间的区别:
在 WebView 的设计中,不是什么事都要 WebView类干的,有些杂事是分给其他人的,这样 WebView 专心干好 自己的解析、渲染工作就行了.WebViewClient 就是帮助 WebView 处理各种通知、请求事件等 ,WebChromeClient 是辅助 WebView 处理 Javascript 的对话框,网站图标,网站 title. [截取自张涛的开源实验室](他网站的排版和背景地板转不错)

同步java和h5的cookie4

让webview打开h5页面后无需再登陆,有系统的方法可以直接使用.

public static void synCookies(Context context, String url, String cookie) {    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {        CookieSyncManager.createInstance(context);    }    CookieManager cookieManager = CookieManager.getInstance();    cookieManager.setAcceptCookie(true);    cookieManager.removeSessionCookie();    String[] strings = cookie.split(";");    for (String s : strings) {        cookieManager.setCookie(url, s);    }    CookieSyncManager.getInstance().sync();}

注意由于cookie有本身格式要求,设置的不对就认为没登陆了,需要cookie.split(“;”)这么分隔开再逐个设置.

从h5获取webview标题

mWebView.setWebChromeClient(new WebChromeClient(){        @Override        public void onReceivedTitle(WebView view, String title) {            super.onReceivedTitle(view, title);            tvTitle.setText(title);        }    });

recommend:

Android中Java和JavaScript交互,慕课网手记

WebView—Android与js交互实例,

深入讲解WebView(下),

Android中WebView无法后退和js注入漏洞的解决方案, 这一篇还没仔细看,是回退相关的事,故分享之

0 0