android webView笔记
来源:互联网 发布:mysql 5.7 sysbench 编辑:程序博客网 时间:2024/04/29 08:53
WebView 概述:
WebView(网络视图)能加载显示网页,可以将其视为一个浏览器。WebView内部实现是采用渲染引擎来展示view的内容,提供网页前进后退,网页放大,缩小,搜索等。
1.WebView的基本使用:
1.在要Activity中实例化WebView组件:WebView webView = new WebView(this);
2.调用WebView的loadUrl()方法,设置WevView要显示的网页:
互联网用:webView.loadUrl("http://www.google.com");
本地文件用:webView.loadUrl("file:///android_asset/XX.html"); 本地文件存放在:assets 文件中
3.调用Activity的setContentView( )方法来显示网页视图
4.加入网络权限<uses-permissionandroid:name="android.permission.INTERNET"/>
2.WebView API使用详解
1)请求加载网页部分
public void loadData (String data, String mimeType, String encoding)
加载指定的data数据
参数说明:
data 字符串String形式的数据 可以通过base64编码而来
mineType data数据的 MIME类型, e.g. 'text/html'
encoding data数据的编码格式
注:
1.Javascript有同源限制,同源策略限制了一个源中加载文本或者脚本与来自其他源中的数据交互方式。避免这种限制可以使用loadDataWithBaseURL()方法。
2.encoding参数制定data参数是否为base64或者 URL 编码,如果data是base64编码那么 encoding必须填写 "base64“。
public void loadDataWithBaseURL (String baseUrl, String data, String mimeType, String encoding, String historyUrl)使用baseUrl加载base URL的网页内容,baseUrl解决相关url使用Javascript相同源问题。
public void loadUrl (String url)加载制定url的网页内容
public void loadUrl (String url, Map<String, String> additionalHttpHeaders)加载制定url并携带http header数据。
public void reload () 重新加载页面。注:<span style="color:#ff0000;">页面所有资源会重新加载</span><pre name="code" class="java"> public void stopLoading ()停止加载
2) 前进后退
<pre name="code" class="java">public void goBack ()
public void goForward ()
public void goBackOrForward (int steps)
以当前的index为起始点前进或者后退到历史记录中指定的steps, 如果steps为负数则为后退,正数则为前进
public boolean canGoForward ()
<span><span></span></span><pre name="code" class="java"><pre name="code" class="java"><span style="font-size:10px;"><span style="font-size: 15px;">检查是否有可以前进的历史记录。</span></span>
public boolean canGoBack ()
<span><span></span></span><pre name="code" class="java"><pre name="code" class="java"><pre name="code" class="java"><span style="font-size:10px;"><span style="font-size: 15px;">检查是否有可以后退的历史记录。</span></span>
3)JavaScript操作
public void addJavascriptInterface (Object object, String name)
当网页需要和App进行交互时,可以注入Java对象提供给JavaScritp调用. Java对象提供相应的方法供js使用.
可以通过getSettings()
获得WebSettings,然后用setJavaScriptEnabled()
使能JavaScript:
注:(重要)
问题:在Android 4.2以下使用这个api会涉及到JavaScript安全问题, javascript可以通过反射这个java对象的相关类进行攻击。
解决:可以采用白名单的机制调用这个方法.
在Android4.2极其以上系统需要给提供js调用的方法前加入一个注视:@JavaScriptInterface; 在虚拟机当中 Javascript调用Java方法会检测这个anotation,如果方法被标识@JavaScriptInterface则Javascript可以成功调用这个Java方法,否则调用不成功。
example:
class JsObject { @JavascriptInterface public String toString() { return "injectedObject"; } } webView.addJavascriptInterface(new JsObject(), "injectedObject");
public void evaluateJavascript (String script, ValueCallback<String> resultCallback)
这个方法在Android 4.4系统引入,因此只能在Android4.4系统中才能使用,提供在当前页面显示上下文中异步执行javascript代码
注:(重要)
这个方法必须在UI线程调用,这个函数的回调也会在UI线程执行。
那么在Android4.4一下如何执行javascrit代码呢
可以通过 WebView提供的loadUrl方法:具体格式如下:
webView.loadUrl("javascript:alert(injectedObject.toString())");其中javascript: 是执行javascript代码的标识 , 后面是javascript语句。
public void removeJavascriptInterface (String name)删除addJavascripInterface时对webview注入的java对象. 此方法在不同的Android系统WebView会有问题,会存在失效情况。
4)网页查找功能
public void findAllAsync (String find)异步执行查找网页内包含的字符并设置高亮,查找结果会回调.
public void findNext (boolean forward)查找下一个匹配的字符
example:
public class TestFindListener implements android.webkit.WebView.FindListener { private FindListener mFindListener; public TestFindListener(FindListener findListener) { mFindListener = findListener; } @Override public void onFindResultReceived(int activeMatchOrdinal, int numberOfMatches, boolean isDoneCounting) { mFindListener.onFindResultReceived(activeMatchOrdinal, numberOfMatches, isDoneCounting); } } public void findAllAsync(String searchString) { if (android.os.Build.VERSION_CODES.JELLY_BEAN <= Build.VERSION.SDK_INT) mWebView.findAllAsync(searchString); else { int number = mWebView.findAll(searchString); if (mIKFindListener !=null) mIKFindListener.onFindResultReceived(number); fixedFindAllHighLight(); // 参见我之前一篇博文Android WebView API findAll bug } } mWebView.findNext(forward);
5)数据清除
public void clearCache (boolean includeDiskFiles)清除网页访问留下的缓存,由于内核缓存是全局的因此这个方法不仅仅针对webview而是针对整个应用程序.
public void clearFormData ()这个api仅仅清除自动完成填充的表单数据,并不会清除WebView存储到本地的数据。
public void clearHistory ()清除当前webview访问的历史记录,只会webview访问历史记录里的所有记录除了当前访问记录.
public void clearMatches ()清除网页查找的高亮匹配字符
3.WebViewClient API详解
1)网页加载时机部分
public boolean shouldOverrideUrlLoading(WebView view, String url)当加载的网页需要重定向的时候就会回调这个函数告知我们应用程序是否需要接管控制网页加载,如果应用程序接管,并且return true意味着主程序接管网页加载,如果返回false让webview自己处理。
public void onPageStarted(WebView view, String url, Bitmap favicon)当内核开始加载访问的url时,会通知应用程序,对每个main frame这个函数只会被调用一次,页面包含iframe 或者framesets 不会另外调用一次onPageStarted,当网页内内嵌的frame 发生改变时也不会调用onPageStarted。
public void onPageFinished(WebView view, String url)当内核加载完当前页面时会通知我们的应用程序,这个函数只有在main frame情况下才会被调用,当调用这个函数之后,渲染的图片不会被更新,如果需要获得新图片的通知可以使用@link WebView.PictureListener#onNewPicture。
public void onLoadResource(WebView view, String url)通知应用程序WebView即将加载url 制定的资源
public WebResourceResponse shouldInterceptRequest(WebView view, String url)通知应用程序内核即将加载url制定的资源,应用程序可以返回本地的资源提供给内核,若本地处理返回数据,内核不从网络上获取数据。
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)当浏览器访问制定的网址发生错误时会通知我们应用程序,比如网络错误。
public void onFormResubmission(WebView view, Message dontResend, Message resend)如果浏览器需要重新发送POST请求,可以通过这个时机来处理。默认是不重新发送数据。
public void doUpdateVisitedHistory(WebView view, String url, boolean isReload)通知应用程序可以将当前的url存储在数据库中,意味着当前的访问url已经生效并被记录在内核当中。这个函数在网页加载过程中只会被调用一次。注意网页前进后退并不会回调这个函数。
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error)当网页加载资源过程中发现SSL错误会调用此方法。我们应用程序必须做出响应,是取消请求handler.cancel(),还是继续请求handler.proceed();内核的默认行为是handler.cancel();
public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm)通知应用程序WebView接收到了一个Http auth的请求,应用程序可以使用supplied 设置webview的响应请求。默认行为是cancel 本次请求。
public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event)提供应用程序同步一个处理按键事件的机会,菜单快捷键需要被过滤掉。如果返回true,webview不处理该事件,如果返回false, webview会一直处理这个事件,因此在view 链上没有一个父类可以响应到这个事件。默认行为是return false;
public void onScaleChanged(WebView view, float oldScale, float newScale)通知应用程序webview 要被scale。应用程序可以处理改事件,比如调整适配屏幕。
public void onReceivedLoginRequest(WebView view, String realm, String account, String args)通知应用程序有个自动登录的帐号过程
4. WebChromeClient API详解
public void onProgressChanged(WebView view, int newProgress)通知应用程序当前网页加载的进度。
public void onReceivedTitle(WebView view, String title)当document 的title变化时,会通知应用程序
public void onReceivedIcon(WebView view, Bitmap icon)当前页面有个新的favicon时候,会回调这个函数。
public void onReceivedTouchIconUrl(WebView view, String url, boolean precomposed)
public void onShowCustomView(View view, CustomViewCallback callback)通知应用程序webview需要显示一个custom view,主要是用在视频全屏HTML5Video support。
public void onHideCustomView()退出视频通知
public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg)请求创建一个新的窗口,如果我们应用程序接管这个请求,必须返回true,并且创建一个新的webview来承载主窗口。
private void createWindow(final Message msg) { WebView.WebViewTransport transport = (WebView.WebViewTransport) msg.obj; final Tab newTab = mWebViewController.openTab(null, Tab.this, true, true); transport.setWebView(newTab.getWebView()); msg.sendToTarget(); }
public void onRequestFocus(WebView view)webview请求得到focus,发生这个主要是当前webview不是前台状态,是后台webview。
public void onCloseWindow(WebView window)通知应用程序从关闭传递过来的webview并从view tree中remove。
public boolean onJsAlert(WebView view, String url, String message, JsResult result)通知应用程序显示javascript alert对话框,如果应用程序返回true内核认为应用程序处理这个消息,返回false,内核自己处理。
@param url 当前请求弹出javascript 对话框webview 加载的url地址。
public boolean onJsConfirm(WebView view, String url, String message, JsResult result)通知应用程序提供confirm 对话框。
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result)通知应用程序显示一个prompt对话框。
public boolean onJsBeforeUnload(WebView view, String url, String message, JsResult result)通知应用程序显示一个对话框,让用户选择是否离开当前页面,这个回调是javascript中的onbeforeunload事件,如果客户端返回true,内核会认为客户端提供对话框。默认行为是return false。
public void onExceededDatabaseQuota(String url, String databaseIdentifier, long quota, long estimatedDatabaseSize, long totalQuota, WebStorage.QuotaUpdater quotaUpdater)通知应用程序webview内核web sql 数据库超出配额,请求是否扩大数据库磁盘配额。默认行为是不会增加数据库配额。
public void onReachedMaxAppCacheSize(long requiredStorage, long quota, WebStorage.QuotaUpdater quotaUpdater)通知应用程序内核已经到达最大的appcache。
public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback)当前页面请求是否允许进行定位。
public void onGeolocationPermissionsHidePrompt()
public void openFileChooser(ValueCallback<Uri> uploadFile, String acceptType, String capture)这个回调是私有回调, 当页面需要请求打开系统的文件选择器,则会回调这个方法,比如我们需要上传图片,请求拍照,邮件的附件上传等等操作。
5.WebSettings API详解
调用WebSettings设置的所有函数是异步制定的,因此我们设置某个状态并不能马上生效。public synchronized void setLoadsImagesAutomatically(boolean flag)设置当前webview是否需要加载图片,这个标记控制整个webview的状态,并且对所有的资源都采取这种策略。如果设置为false 那么访问的当前网址中的所以图片资源将不会被加载。默认值是true;
public synchronized void setBlockNetworkImage (boolean flag)
当getLoadsImagesAutomatically返回true这个方法才有效, 默认值为:false;
public void setCacheMode(int mode)一个普通网页的加载cache会被检查,内容也会被重新校验,第一次访问网页时,会存储cache到本地,设置策略可以让网页加载方式发生变化,cache模式有如下几种:
public void setLoadWithOverviewMode(boolean overview)
概览模式的设置,默认指是false。
public synchronized void setJavaScriptEnabled (boolean flag)默认值是false. 如果我们网页需要javascript时,需要开启这个设置,否则网页加载不全。
webSettings.setUseWideViewPort(true);//设置此属性,可任意比例缩放webSettings.setLoadWithOverviewMode(true);打开页面时, 自适应屏幕
WebSettings webSettings = mWebView .getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setBuiltInZoomControls(true);webSettings.setSupportZoom(true);便页面支持缩放
webview.requestFocusFromTouch();如果webView中需要用户手动输入用户名、密码或其他,则webview必须设置支持获取手势焦点。
setJavaScriptEnabled(true); //支持jssetPluginsEnabled(true); //支持插件 setUseWideViewPort(false); //将图片调整到适合webview的大小 setSupportZoom(true); //支持缩放 setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); //支持内容重新布局 supportMultipleWindows(); //多窗口 setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //关闭webview中缓存 setAllowFileAccess(true); //设置可以访问文件 setNeedInitialFocus(true); //当webview调用requestFocus时为webview设置节点webview webSettings.setBuiltInZoomControls(true); //设置支持缩放 setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口 setLoadWithOverviewMode(true); // 缩放至屏幕的大小setLoadsImagesAutomatically(true); //支持自动加载图片
- Android WebView学习笔记
- WebView使用笔记 Android
- Android WebView 笔记
- [笔记] Android WebView使用方法
- Android WebView 使用笔记
- android WebView笔记
- Android WebView学习笔记
- Android WebView使用笔记
- android webview 学习笔记
- Android:控件WebView笔记
- android webView笔记
- android学习笔记之WebView
- Android开发学习笔记WebView
- Android笔记——WebView
- Android笔记(十四)WebView
- Android开发笔记之WebView
- Android WebView 开发使用笔记
- Android开发学习笔记之浅谈WebView
- linux下tar rar 7z zip xz格式的压缩与解压
- NPOI2.2.0.0实例详解(八)—设置EXCEL单元格【数字格式】
- 安装Libevent
- ScrollView中的ListView只显示一条数据的解决方法
- 【code】jQuery实现鼠标单击显示内容
- android webView笔记
- 手动清除或刷新Linux的SWAP分区
- 【JavaWeb】之过滤器Filter
- 构造器内部的多态方法的行为
- jmeter之编写java请求一beashell调用java代码(下篇)(推荐
- iOS 开发 消除导航栏黑线
- 接口对接:关于明文和密钥,还有生成Sign工具类
- python基础教程共60课-第15课循环的嵌套
- 销售报表