记录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注入漏洞的解决方案, 这一篇还没仔细看,是回退相关的事,故分享之
- 记录webview与js交互
- webview与js交互
- webview与js交互
- webview与js交互
- webview与js交互
- webview与js交互
- webview与js交互
- WebView与JS交互
- webView与js交互
- webView与js交互
- webview与js交互
- webview与js交互
- webview与js交互
- webview与js交互
- WebView与JS交互
- webview与js交互
- Webview 与JS 交互
- webview与js交互
- 如何在Ubuntu 14.10 上安装WordPress?
- Unity中画实线与虚线
- 小码哥-玩转【斗鱼直播APP】系列之首页布局分析实现
- 容斥原理
- android usb 流程
- 记录webview与js交互
- NOIP2016 酱油记
- Oracle 11G Client 客户端安装步骤(图文详解) .
- 如何删除ubuntu的screen
- ubuntu环境变量
- C#60课的主要内容
- python爬虫入门
- ios断言的使用(NSAssert)
- liferay调度器-定时任务