安卓webview开发简介
1.WebView的基本使用
(1)创建WebView的实例加入到Activity view tree中
WebView webview = new WebView(this);
setContentView(webview);
- 1
(2)在xml中配置WebView
<Webview android:layout_width="match_parent" android:layout_height="match_parent" >
</Webview>
- 1
(3)访问网页
webview.loadUrl("http://developer.android.com/");
- 1
2.WebView API使用详解
1)请求加载网页部分
public void loadData (String data, String mimeType, String encoding)
- 1
加载指定的data数据
参数说明:
data 字符串String形式的数据 可以通过base64编码而来
mineType data数据的 MIME类型, e.g. ‘text/html’
encoding data数据的编码格式
Tips:
1.Javascript有同源限制,同源策略限制了一个源中加载文本或者脚本与来自其他源中的数据交互方式。避免这种限制可以使用loadDataWithBaseURL()方法。
2.encoding参数制定data参数是否为base64或者 URL 编码,如果data是base64编码那么 encoding必须填写 “base64“。
http://developer.android.com/reference/android/webkit/WebView.html
public void loadDataWithBaseURL (String baseUrl, String data, String mimeType, String encoding, String historyUrl)
- 1
使用baseUrl加载base URL的网页内容,baseUrl解决相关url使用Javascript相同源问题。
public void loadUrl (String url)
- 1
加载制定url的网页内容
public void loadUrl (String url, Map<String, String> additionalHttpHeaders)
- 1
加载制定url并携带http header数据。
public void reload ()
- 1
重新加载页面
Tip(重要)
页面所有资源会重新加载
public void stopLoading ()
- 1
2) 前进后退
public void goBack ()
- 1
public void goForward ()
- 1
public void goBackOrForward (int steps)
- 1
以当前的index为起始点前进或者后退到历史记录中指定的steps, 如果steps为负数则为后退,正数则为前进
public boolean canGoForward ()
- 1
public boolean canGoBack ()
- 1
3)JavaScript操作
public void addJavascriptInterface (Object object, String name)
- 1
当网页需要和App进行交互时,可以注入Java对象提供给JavaScritp调用. Java对象提供相应的方法供js使用.
Tips(重要)
问题:在Android 4.2以下使用这个api会涉及到JavaScript安全问题, javascript可以通过反射这个Java对象的相关类进行攻击。
解决:可以采用白名单的机制调用这个方法.
在Android4.2极其以上系统需要给提供js调用的方法前加入一个注视:@JavaScript***重点内容***Interface; 在虚拟机当中 Javascript调用Java方法会检测这个anotation,如果方法被标识@JavaScriptInterface则Javascript可以成功调用这个Java方法,否则调用不成功。
example:
class JsObject { @JavascriptInterface public String toString() { return "injectedObject"; }
}
webView.addJavascriptInterface(new JsObject(), "injectedObject");
- 1
public void evaluateJavascript (String script, ValueCallback<String> resultCallback)
- 1
这个方法在Android 4.4系统引入,因此只能在Android4.4系统中才能使用,提供在当前页面显示上下文中异步执行javascript代码
Tips(重要)
这个方法必须在UI线程调用,这个函数的回调也会在UI线程执行。
那么在Android4.4一下如何执行javascrit代码呢
可以通过 WebView提供的loadUrl方法:具体格式如下:
webView.loadUrl("javascript:alert(injectedObject.toString())");
- 1
其中javascript: 是执行javascript代码的标识 , 后面是javascript语句。
这里写代码片
- 1
public void removeJavascriptInterface (String name)
删除addJavascripInterface时对webview注入的java对象. 此方法在不同的Android系统WebView会有问题,会存在失效情况。
4)网页查找功能
public int findAll (String find) PI在Android 4.1 就已经被去除, 在Android 4.1极其以上系统使用findAllAsync方法
这个API还存在bug 具体请见我的之前一篇博文Android WebView findAll bug
- 1
public void findAllAsync (String find)
异步执行查找网页内包含的字符并设置高亮,查找结果会回调.
- 1
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);
- 1
5)数据清除部分
public void clearCache (boolean includeDiskFiles)
- 1
清除网页访问留下的缓存,由于内核缓存是全局的因此这个方法不仅仅针对webview而是针对整个应用程序.
public void clearFormData ()
- 1
这个api仅仅清除自动完成填充的表单数据,并不会清除WebView存储到本地的数据。
public void clearHistory ()
- 1
清除当前webview访问的历史记录,只会webview访问历史记录里的所有记录除了当前访问记录.
public void clearMatches ()
- 1
清除网页查找的高亮匹配字符
public void clearView ()
- 1
在Android 4.3及其以上系统这个api被丢弃了, 并且这个api大多数情况下会有bug,经常不能清除掉之前的渲染数据。官方建议通过loadUrl(“about:blank”)来实现这个功能,阴雨需要重新加载一个页面自然时间会收到影响。
6)WebView的状态
这里写代码片
- 1
public void onResume ()
激活WebView为活跃状态,能正常执行网页的响应
public void onPause ()
- 1
当页面被失去焦点被切换到后台不可见状态,需要执行onPause动过, onPause动作通知内核暂停所有的动作,比如DOM的解析、plugin的执行、JavaScript执行。并且可以减少不必要的CPU和网络开销,可以达到省电、省流量、省资源的效果。
public void pauseTimers ()
- 1
当应用程序被切换到后台我们使用了webview, 这个方法不仅仅针对当前的webview而是全局的全应用程序的webview,它会暂停所有webview的layout,parsing,javascripttimer。降低CPU功耗。
public void resumeTimers ()
- 1
恢复pauseTimers时的动作。
public void destroy ()
Tips(重要)
这个方法必须在webview从view tree中删除之后才能被执行, 这个方法会通知native释放webview占用的所有资源。
7) WebView 事件回调监听
这里写代码片
- 1
public void setWebChromeClient (WebChromeClient client)
主要通知客户端app加载当前网页的 title,Favicon,progress,javascript dialog等事件,通知客户端处理这些相应的事件。
public void setWebViewClient (WebViewClient client)
- 1
主要通知客户端app加载当前网页时的各种时机状态,onPageStart,onPageFinish,onReceiveError等事件。
8) Android 5.0 Lollipop 新API
public static void enableSlowWholeDocumentDraw ()
- 1
Android 5.0 Webview默认提供减少内存占用支持,并且智能选择需要绘制的HTML document部门来提供性能。 当然开发者可以在自己应用程序需要时关闭这个选项(enableSlowWholeDocumentDraw)。
- WebView Demo
package com.example.webviewdemo; import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Message;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient; public class WebViewBase extends WebView { private static final String DEFAULT_URL = "http://www.ijinshan.com/"; private Activity mActivity; public WebViewBase(Context context) { super(context); mActivity = (Activity) context; init(context); } @SuppressLint("SetJavaScriptEnabled") private void init(Context context) { WebSettings webSettings = this.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setSupportZoom(true); //webSettings.setUseWideViewPort(true); this.setWebViewClient(mWebViewClientBase); this.setWebChromeClient(mWebChromeClientBase); this.loadUrl(DEFAULT_URL); this.onResume(); } private WebViewClientBase mWebViewClientBase = new WebViewClientBase(); private class WebViewClientBase extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // TODO Auto-generated method stub return super.shouldOverrideUrlLoading(view, url); } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { // TODO Auto-generated method stub super.onPageStarted(view, url, favicon); } @Override public void onPageFinished(WebView view, String url) { // TODO Auto-generated method stub super.onPageFinished(view, url); } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { // TODO Auto-generated method stub super.onReceivedError(view, errorCode, description, failingUrl); } @Override public void doUpdateVisitedHistory(WebView view, String url, boolean isReload) { // TODO Auto-generated method stub super.doUpdateVisitedHistory(view, url, isReload); } } private WebChromeClientBase mWebChromeClientBase = new WebChromeClientBase(); private class WebChromeClientBase extends WebChromeClient { @Override public void onProgressChanged(WebView view, int newProgress) { mActivity.setProgress(newProgress * 1000); } @Override public void onReceivedTitle(WebView view, String title) { // TODO Auto-generated method stub super.onReceivedTitle(view, title); } @Override public void onReceivedTouchIconUrl(WebView view, String url, boolean precomposed) { // TODO Auto-generated method stub super.onReceivedTouchIconUrl(view, url, precomposed); } @Override public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) { // TODO Auto-generated method stub return super.onCreateWindow(view, isDialog, isUserGesture, resultMsg); } }
}
- 1
<uses-permission android:name="android.permission.INTERNET" />
安卓webview开发简介相关推荐
- 1.0 Kotlin-Android开发简介
Kotlin-Android开发简介 Android简介 Android历程 Android系统架构 应用层 框架层 系统运行库 硬件抽像层 系统内核层 Android优势 开放性 丰富的硬件 方便开 ...
- 网络增强现实开发简介 Introduction to Web AR development
搭配webXR.mindAR.three.js和tensorflow.js 你会学到: 获得构建不同类型的网络增强现实应用程序的实践经验,包括图像效果.人脸效果和世界效果 获得关于增强现实如何在网络浏 ...
- Android WebView开发问题汇总
在native与网页相结合开发的过程中,难免会遇到关于WebView一些共通的问题.就我目前开发过程中遇到的问题以及最后得到的优化方案都将在这里列举出来.有些是老生常谈,有些则是个人摸索得出解决方法. ...
- Android WebView开发问题及优化汇总
我们在native与网页相结合开发的过程中,难免会遇到关于WebView一些共通的问题.就我目前开发过程中遇到的问题以及最后得到的优化方案都将在这里列举出来.有些是老生常谈,有些则是个人摸索得出解决方 ...
- 安卓应用开发顶级框架大盘点,总有一款适合你
作者 | Slava Vaniukov 译者 | 苏本如,责编 | 夕颜 封图 | CSDN下载自视觉中国 出品 | CSDN(ID:CSDNnews) 随着软件开发向移动应用的转变,越来越多的企业意 ...
- 开发安卓app游戏_「安卓APP开发流程」安卓APP如何开发的?
21世纪,智能手机走进了人们的生活,现在的智能手机的操作系统基本分为两种,一种是IOS系统(苹果系统).安卓系统,其中,安卓系统是开源的,所以很多品牌商会讲安卓包装成自己的系统,但核心还是一样的,都是 ...
- 安卓TV开发(九) Android模拟事件 遥控器变身成鼠标来操作TV
本文出处:http://blog.csdn.net/sk719887916/article/details/40348853,作者:skay 阅读此文建议先阅读 安卓Tv开发(二)移动智能电 ...
- 桃词典 Peach Dictionary 简易英语词典app开发 安卓软件开发 Part 8
前文: 桃词典 Peach Dictionary 简易英语词典app开发 安卓软件开发 Part 7 导航: 桃词典 Peach Dictionary 简易英语词典app开发 安卓软件开发 ...
- 安卓app开发方案_「安卓APP开发流程」安卓APP如何开发的?
21世纪,智能手机走进了人们的生活,现在的智能手机的操作系统基本分为两种,一种是IOS系统(苹果系统).安卓系统,其中,安卓系统是开源的,所以很多品牌商会讲安卓包装成自己的系统,但核心还是一样的,都是 ...
- 已解决:H5移动端网页实现录音功能,js实现录音功能,包括安卓webview接口也可以使用
遇到一个需求,需要做一个手机网页录音的功能,嵌入到webview中去,用安卓原生录音倒是可以,但是想着尽量去安卓化开发,就想着用纯的js前端代码去实现录音功能. 在 Web 应用程序中,JavaScr ...
最新文章
- python使用matplotlib可视化3D曲面图、曲面图表示一个指定的因变量y与两个自变量x和z之间的函数关系
- AJAX培训第二讲:使用AJAX框架(上)
- JAVA基础-面向对象07
- ftm模块linux驱动,飞思卡尔k系列_ftm模块详解.doc
- FCGF论文阅读笔记
- blender使用_DigiVita使用Blender教女孩编码
- 机器视觉用c还是python_机器视觉_opencv-python环境搭建
- Tomcat详解(一)——tomcat基础知识
- 二进制、十进制、十六进制数值对照表
- TeamFlowy——结合Teambition与Workflowy
- Python生成字符视频
- 2023计算机毕业设计SSM最新选题之java养生知识平台99ofs
- 字体发光特效html视频,视频特效立体流光字制作
- 购房税费计算技术支持
- 数字转中文大写= 1234= 一千二百三十四
- Java练习题:算法(冒泡排序)
- tableau-去掉ABC方法
- Java面试之搜狐畅游COO面试之惨败
- solr分组查询、统计功能详解
- RoadFlow工作流使用快速入门
热门文章
- ApacheCN 编程/大数据/数据科学/人工智能学习资源 2019.12
- Intellij IDEA2017破解
- 多多客API SDK【拼多多开放平台】
- 西门子PLC指令寻址方式
- 渠道类:新APP上线都有哪些具体的推广方式可以学习(最新)
- WIN7封装教程2018系列(二)—必要的系统调整
- 干货!NB-IoTLoRa物联网项目实操来了!
- PADS9.5 导入立创元器件库卡顿
- sftp上传文件到服务器遇到的问题
- STM32CubeMX | 37 - 使用RS485总线进行双板通信(SP3485)