Android系统 WebView是啥?有啥用?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android系统 WebView是啥?有啥用?相关的知识,希望对你有一定的参考价值。

android系统 WebView是什么?有什么用?如图

现在越来越多的APP都内置了Web网页去加载视图,也就是我们常说的Hybrid APP混合应用,市场上很多平台都是这样做的,比如我们经常使用的淘宝、京东等电商平台。这些是如何实现的呢?在我们Android中有一个WebView组件,它就可以实现此类功能。它是Android中的原生UI控件,主要用于在APP应用中方便地访问远程网页或本地html资源,同时WebView也在Android中充当Java代码和JS代码之间交互的桥梁,实际上也可以将WebView看做一个功能最小化的浏览器。下面我们一起来看看WebView的一些常用的使用方法。

WebView是Android系统提供的一个能显示网页的系统控件,它是一个特殊的View,同时也是一个ViewGroup,可以有很多其他子View。在Android 4.4以下(不包含4.4)系统WebView底层实现是采用WebKit内核,而在Android 4.4及其以上Google采用了Chromium内核作为系统WebView的底层内核支持。在这一变化中Android提供的WebView相关API并没有发生较大变化,在4.4上也兼容低版本的API并且引进了少部分API。这里简单介绍下基于Chromium的WebView和基于WebKit的WebView之间的差异,基于Chromium的Webview提供了更广的HTML5、CSS3、javascript支持,在Android系统版本5.0上基于Chromium 37,WebView提供了绝大多数的HTML5特性支持,除此之外Chromium也支持远程调试(Chrome DevTools)。WebKit JavaScript引起采用WebCore JavaScript在Android 4.4上换成了V8能直接提升JavaScript性能。

二、作用
1、显示和渲染Web页面
2、使用html文件(网络上或本地assets中)作为布局
3、可与JavaScript交互调用
注: WebView控件功能强大,除了具有一般View的属性和设置外,还可以对Url请求、页面加载、渲染、页面交互进行强大的处理。
参考技术A Copyright © 1999-2020, CSDN.NET, All Rights Reserved

2021校招offer薪资
登录

顾缘君兮
关注
Android WebView基本使用 转载
2020-11-09 10:35:31

顾缘君兮

码龄3年

关注
转载请注明出处:

http://blog.csdn.net/lowprofile_coding/article/details/77928614
1
1
WebView介绍
Android WebView在Android平台上是一个特殊的View, 基于webkit引擎、展现web页面的控件,这个类可以被用来在你的app中仅仅显示一张在线的网页,还可以用来开发浏览器。WebView内部实现是采用渲染引擎来展示view的内容,提供网页前进后退,网页放大,缩小,搜索。Android的Webview在低版本和高版本采用了不同的webkit版本内核,4.4后直接使用了Chrome。

现在很多APP都内置了Web网页,比如说很多电商平台,淘宝、京东、聚划算等等。WebView比较灵活,不需要升级客户端,只需要修改网页代码即可。一些经常变化的页面可以用WebView这种方式去加载网页。例如中秋节跟国庆节打开的页面不一样,如果是用WebView显示的话,只修改修改html页面就行,而不需要升级客户端。

Webview功能强大,可以直接使用html文件(本地sdcard/assets目录),还可以直接加载url,使用JavaScript可以html跟原生APP互调。

加载html四种方式
webView.loadUrl("http://139.196.35.30:8080/OkHttpTest/apppackage/test.html");//加载url

webView.loadUrl("file:///android_asset/test.html");//加载asset文件夹下html

//方式3:加载手机sdcard上的html页面
webView.loadUrl("content://com.ansen.webview/sdcard/test.html");

//方式4 使用webview显示html代码
webView.loadDataWithBaseURL(null,"<html><head><title> 欢迎您 </title></head>" +
"<body><h2>使用webview显示 html代码</h2></body></html>", "text/html" , "utf-8", null);
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
WebViewClient与WebChromeClient区别
使用WebView基本都会使用这两个类,那他们有哪些区别呢?

WebViewClient主要帮助WebView处理各种通知、请求事件的,有以下常用方法:

onPageFinished 页面请求完成
onPageStarted 页面开始加载
shouldOverrideUrlLoading 拦截url
onReceivedError 访问错误时回调,例如访问网页时报错404,在这个方法回调的时候可以加载错误页面。
WebChromeClient主要辅助WebView处理Javascript的对话框、网站图标、网站title、加载进度等,有以下常用方法。

onJsAlert webview不支持js的alert弹窗,需要自己监听然后通过dialog弹窗
onReceivedTitle 获取网页标题
onReceivedIcon 获取网页icon
onProgressChanged 加载进度回调
简单使用
因为需要加载网页url,所以需要在AndroidManifest.xml中添加访问网络权限。

<uses-permission android:name="android.permission.INTERNET" />
1
1
布局文件:activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

<ProgressBar
android:id="@+id/progressbar"
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="3dip"
android:max="100"
android:progress="0"
android:visibility="gone"/>
</FrameLayout>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
外层FrameLayout,里面有WebView跟ProgressBar,WebView的宽高匹配父类,ProgressBar横向进度条,高度3dip,按照FrameLayout布局规则,ProgressBar会覆盖在WebView之上,默认是隐藏不显示。

MainActivity.java

public class MainActivity extends AppCompatActivity
private WebView webView;
private ProgressBar progressBar;

@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

progressBar= (ProgressBar)findViewById(R.id.progressbar);//进度条

webView = (WebView) findViewById(R.id.webview);
// webView.loadUrl("file:///android_asset/test.html");//加载asset文件夹下html
webView.loadUrl("http://139.196.35.30:8080/OkHttpTest/apppackage/test.html");//加载url

//使用webview显示html代码
// webView.loadDataWithBaseURL(null,"<html><head><title> 欢迎您 </title></head>" +
// "<body><h2>使用webview显示 html代码</h2></body></html>", "text/html" , "utf-8", null);

webView.addJavascriptInterface(this,"android");//添加js监听 这样html就能调用客户端
webView.setWebChromeClient(webChromeClient);
webView.setWebViewClient(webViewClient);

WebSettings webSettings=webView.getSettings();
webSettings.setJavaScriptEnabled(true);//允许使用js

/**
* LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据
* LOAD_DEFAULT: (默认)根据cache-control决定是否从网络上取数据。
* LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.
* LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。
*/
webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);//不使用缓存,只从网络获取数据.

//支持屏幕缩放
webSettings.setSupportZoom(true);
webSettings.setBuiltInZoomControls(true);

//不显示webview缩放按钮
// webSettings.setDisplayZoomControls(false);


//WebViewClient主要帮助WebView处理各种通知、请求事件
private WebViewClient webViewClient=new WebViewClient()
@Override
public void onPageFinished(WebView view, String url) //页面加载完成
progressBar.setVisibility(View.GONE);


@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) //页面开始加载
progressBar.setVisibility(View.VISIBLE);


@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
Log.i("ansen","拦截url:"+url);
if(url.equals("http://www.google.com/"))
Toast.makeText(MainActivity.this,"国内不能访问google,拦截该url",Toast.LENGTH_LONG).show();
return true;//表示我已经处理过了

return super.shouldOverrideUrlLoading(view, url);


;

//WebChromeClient主要辅助WebView处理Javascript的对话框、网站图标、网站title、加载进度等
private WebChromeClient webChromeClient=new WebChromeClient()
//不支持js的alert弹窗,需要自己监听然后通过dialog弹窗
@Override
public boolean onJsAlert(WebView webView, String url, String message, JsResult result)
AlertDialog.Builder localBuilder = new AlertDialog.Builder(webView.getContext());
localBuilder.setMessage(message).setPositiveButton("确定",null);
localBuilder.setCancelable(false);
localBuilder.create().show();

//注意:
//必须要这一句代码:result.confirm()表示:
//处理结果为确定状态同时唤醒WebCore线程
//否则不能继续点击按钮
result.confirm();
return true;


//获取网页标题
@Override
public void onReceivedTitle(WebView view, String title)
super.onReceivedTitle(view, title);
Log.i("ansen","网页标题:"+title);


//加载进度回调
@Override
public void onProgressChanged(WebView view, int newProgress)
progressBar.setProgress(newProgress);

;

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
Log.i("ansen","是否有上一个页面:"+webView.canGoBack());
if (webView.canGoBack() && keyCode == KeyEvent.KEYCODE_BACK)//点击返回按钮的时候判断有没有上一页
webView.goBack(); // goBack()表示返回webView的上一页面
return true;

return super.onKeyDown(keyCode,event);


/**
* JS调用android的方法
* @param str
* @return
*/
@JavascriptInterface //仍然必不可少
public void getClient(String str)
Log.i("ansen","html调用客户端:"+str);


@Override
protected void onDestroy()
super.onDestroy();

//释放资源
webView.destroy();
webView=null;


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
onCreate 查找控件,给webView设置加载url,添加js监听,监听的名称是”android”,设置webChromeClient跟webViewClient回调,通过getSettings方法获取WebSettings对象,设置允许加载js,设置缓存模式,支持缩放。
webViewClient 重写了几个方法,onPageFinished页面加载完成隐藏进度条,onPageStarted页面开始加载显示进度条,shouldOverrideUrlLoading拦截url,如果请求url是打开google,不让他请求,因为google在国内不能访问,就算请求也请求不到还不如拦截掉,直接告诉用户不能访问。
webChromeClient onJsAlert()因为WebView不支持alert弹窗,在这个方法中用AlertDialog去弹窗。onReceivedTitle获取网页标题。onProgressChanged页面加载进度,把加载进度给progressBar。
onKeyDown 如果点击系统自带返回键&&webView有上一级页面,调用goBack返回。否则不处理。什么时候辉有上一级页面呢?就是你从首页跳转到了一个新页面,点击返回的时候会返回首页。如果本来就在首页点击返回的时候会退出app。
getClient html页面的JS可以通过这个方法回调原生APP,这个方法有个注解@JavascriptInterface,这个是必须的,这个方法有个字符串参数,这个方法跟我们在onCreate中调用addJavascriptInterface传入的name一起使用的。例如html中想要回调这个方法可以这样写:javascript:android.getClient(“传一个字符串给客户端”);
onDestroy activity销毁时释放webView资源。
参考技术B webView是用于展示网络请求后的结果,举个例子:你自己写了个APP,你想要用它访问网络,这里假设你要访问百度首页,你不想用手机的自带浏览器,而是想要用你自己的app在内部展示百度网页,那么就可以用webView啦
说白了:webView就是将url网络请求的结果展示在里面
参考技术C Android系统中用于显示网页内容的组件,更不更无所谓别卸载了就行,它是chrome看视频以及一些视觉元素会用到,有人反应更新后chrome没法看视频了,所以升不升无所谓 参考技术D 自从 google 推出 flutter 跨平台开发框架以来,flutter 在各个技术论坛里被炒得如日中天。

说到跨平台开发,就不得不提 WebView,WebView 可以说是最廉价的跨平台开发方案。我们知道,flutter 可以和 native 混合开发,它们可以互相调用。那么当我们进行混合开发的时候,如果需要使用 WebView,我们应该调用原生的 WebView 还是使用 flutter 自己实现 WebView 呢?如果用 flutter 自己实现 WebView,它的性能与 native 相比如何呢?今天我们就以 android 为例从几个不同的维度来实际测试一下!

Flutter 实现 WebView
flutter 官方是没有 WebView 组件的,不过强大的 flutter-community 论坛考虑到广大开发者的需求,开发了 flutter_webview_plugin 插件,方便在 flutter 中使用使用 WebView。

集成方式很简单,在 pubspec.yaml 文件中:

dependencies: flutter: sdk: flutter flutter_webview_plugin: ^0.3.0+2

接下来所有的对比都是基于 Android 原生的 WebView 和 flutter_webview_plugin 插件,为了严谨,并未对第三方 WebView 作对比。

测试手机:小米8SE
系统:Android 8.1.0
加载速度对比
测试网页打开的速度,只需要获取 WebView 在开始加载网页和网页加载完成时的时间戳,时间戳的差即为打开网页的时间,我们分别在 Android 原生和 flutter 中的相应位置打印 log:

以上是关于Android系统 WebView是啥?有啥用?的主要内容,如果未能解决你的问题,请参考以下文章

我想问一下开了webview有啥用

webview渲染有啥用

Cmake是啥?有啥用?在WINDOWS下如何用

UNIX环境高级编程 学完以后 有啥用? 应用范围是啥?

安卓中的控件是啥意思,有啥用,请详细讲解

嵌入式系统是啥?有啥用?