概念
WebView 是一种嵌入式浏览器,是在软件开发工具包中封装的组件,原生应用可以用它来展示网络内容。
原生应用由专门为特定平台设计的编程语言和 UI 框架编写,不是指在浏览器中运行的跨平台网络应用
浏览器可以想象成两部分,一部分是 UI(地址栏,导航栏按钮等),其它部分是把标记跟代码转换成我们可见和可交互视图的引擎。
WebView 就是浏览器引擎部分,你可以像插入 iframe 一样将 Webview 插入到你的原生应用中,并且编程化的告诉它将会加载什么网页内容。
优势
一、WebView 通常会从 http:// 或者 https:// 地址下载网络内容。这意味着你可以从服务器中获取部分(或全部)Web 应用并且依赖 Webview 将这部分内容展示在原生应用中,而不需要存储在本地。
二、运行在你的 WebView 中的 JavaScript 有能力调用原生的系统 API。这意味着你不必受到 Web 代码通常必须遵守的传统浏览器安全沙箱的限制。
三、当你对 Web 应用进行更新时,所有使用它的设备都可以立即使用该更改,因为内容来自一个集中位置,也就是你的服务器,如果你必须使用纯原生应用,不仅需要为构建应用的每个平台更新项目,你可能必须经历耗时的应用审核过程才能使你的更新在所有的应用商店获取到。从部署和更新的角度来看,混合应用(原生+webview)非常方便
性能问题
webview是原生App开发中底层的软件开发工具包,必然存在性能上的问题,最直观的感受是比原生的要慢。原因如下:
app打开一个页面所经历的阶段
1.webview初始化(页面无反应)
2.建立连接,接收数据,数据初始化(页面无反应 -- 空白)
3.页面渲染,页面loading中
4.页面展示
在原生app中需要先花费时间初始化webview完成后,才开始加载内容,而由于这段时间webview还不存在,所有后续的过程都是完全阻塞的,因此用户感受打开的时间会多一些
性能优化
1.可以在原生App启动时便初始化一个全局的webview待用并隐藏,当用户访问了webview的时候,直接使用这个全局的webview即可加载对应网页
这个方法可以有效的减少webview在app中首次打开时间,当用户访问页面时,不需要初始化webview的时间,但这个方法也会带来一些问题,比如产生额外的内存消耗,在页面间跳转需要情况上一个页面的痕迹,更容易内存泄漏
2.使用客户端代理数据请求,在客户端app初始化webview的同时,直接由原生app开始网络请求数据,当页面初始化完成后,向原生app获取其代理请求的数据。
该方法虽然不能减少webview初始化的时间,但数据请求和webview初始化可以并行进行,从体的页面加载时间就缩短了,缩短总体的页面加载时间
用途
1.显示链接内容,解决用户从一个应用跳转到另一个应用并返回到应用的操作。
2.广告
用法小结
1、加入权限:AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Web page not available错误。
2、在要Activity中生成一个WebView组件:WebView webView = new WebView(this);
3、设置WebView基本信息:
假设访问的页面中有Javascript,则webview必须设置支持Javascript。
webview.getSettings().setJavaScriptEnabled(true);
触摸焦点起作用
requestFocus();
取消滚动栏
this.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);
4、设置WevView要显示的网页:
互联网用:webView.loadUrl("www.google.com");
本地文件用:webView.loadUrl("file:///android_asset/XX.html"); 本地文件存放在:assets文件里
5、假设希望点击链接由自己处理。而不是新开Android的系统browser中响应该链接。
给WebView加入一个事件监听对象(WebViewClient)
并重写当中的一些方法
shouldOverrideUrlLoading:对网页中超链接button的响应。
当按下某个连接时WebViewClient会调用这种方法,并传递參数:按下的url
onLoadResource
onPageStart
onPageFinish
onReceiveError
onReceivedHttpAuthRequest
6、假设用webview点链接看了非常多页以后。假设不做不论什么处理,点击系统“Back”键,整个浏览器会调用finish()而结束自身。假设希望浏览的网页回退而不是退出浏览器,须要在当前Activity中处理并消费掉该Back事件。
覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法。
[java] view plaincopyprint?
public boolean onKeyDown(int keyCoder,KeyEvent event){
if(webView.canGoBack() && keyCoder == KeyEvent.KEYCODE_BACK){
webview.goBack(); //goBack()表示返回webView的上一页面
return true;
}
return false;
}
7、webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
8、通过WebSettings设置WebView的一些属性、状态。通过webView.getSettings获得
比如:setAllowFileAccess(能否访问文件数据)
setBuiltInZoomControls(设置是否支持缩放)、
setCacheMode(设置缓冲的模式)
setJavaScriptEnabled(设置是否支持JavaScript)........