WebView详解(一)

作者: 张天天天天天啊 | 来源:发表于2016-08-17 21:43 被阅读954次

前言

WebView一直是安卓的一个大坑,新版本经常会废弃旧版本的api,导致在使用WevView的时候经常会遇到各种各样的问题,在此整理下WebView的用法及一些坑。

一、 WebView介绍

WebView(网络视图)能加载显示网页,可以将其视为一个浏览器。它使用了WebKit渲染引擎加载显示网页。iOS的UIWebView也同样使用的是WebKit内核,渲染速度却比Android快很多,坑也比Android少。
本章主要包含WebView的简单使用;WebView常用的三个类WebSettings,WebViewClient,WebChromeClient简单介绍;同时介绍下进度条;打开新连接,不跳转到系统浏览器;back键返回访问历史;js与原生互调;加载web url时,插入本地js。

二、使用WebView常用到的三个类

1、WebSettings 关于WebView的一些设置,比如缓存,js等
2、WebViewClient 主要帮助WebView处理各种通知、请求事件等
3、WebChromeClient 主要辅助WebView处理Javascript的对话框、网站图标、网站title、加载进度等

1、WebSettings

方法:
//WebView是否支持使用屏幕上的缩放控件和手势进行缩放,默认值true。设置setBuiltInZoomControls(boolean)可以使用特殊的缩放机制。该项设置不会影响zoomIn() and zoomOut()的缩放操作。
public abstract void setSupportZoom(boolean var1);

//WebView是否需要用户的手势进行媒体播放,默认值为true。
public abstract void setMediaPlaybackRequiresUserGesture(boolean var1);

//是否使用内置的缩放机制。内置的缩放机制包括屏幕上的缩放控件(浮于WebView内容之上)和缩放手势的运用。通过setDisplayZoomControls(boolean)可以控制是否显示这些控件,默认值为false。
public abstract void setBuiltInZoomControls(boolean var1);

//使用内置的缩放机制时是否展示缩放控件,默认值true。参见setBuiltInZoomControls(boolean).
public abstract void setDisplayZoomControls(boolean var1);

//是否允许访问文件,默认允许。注意,这里只是允许或禁止对文件系统的访问,Assets 和 resources 文件使用file:///android_asset和file:///android_res仍是可访问的。
public abstract void setAllowFileAccess(boolean var1);

//是否允许在WebView中访问内容URL(Content Url),默认允许。内容Url访问允许WebView从安装在系统中的内容提供者载入内容。
public abstract void setAllowContentAccess(boolean var1);

//是否允许WebView度超出以概览的方式载入页面,默认false。即缩小内容以适应屏幕宽度。该项设置在内容宽度超出WebView控件的宽度时生效,例如当getUseWideViewPort() 返回true时。
public abstract void setLoadWithOverviewMode(boolean var1);

@Deprecated
public abstract void setEnableSmoothTransition(boolean var1);

@Deprecated
public abstract boolean enableSmoothTransition();

//WebView是否保存表单数据,默认值true。
public abstract void setSaveFormData(boolean var1);

@Deprecated
public abstract void setSavePassword(boolean var1);

@Deprecated
public abstract boolean getSavePassword();

//设置页面上的文本缩放百分比,默认100。
public abstract void setTextZoom(int var1);

@Deprecated
public synchronized void setTextSize(WebSettings.TextSize t) {
    throw new RuntimeException("Stub!");
}

@Deprecated
public synchronized WebSettings.TextSize getTextSize() {
    throw new RuntimeException("Stub!");
}

@Deprecated
public abstract void setDefaultZoom(WebSettings.ZoomDensity var1);

@Deprecated
public abstract WebSettings.ZoomDensity getDefaultZoom();

@Deprecated
public abstract void setLightTouchEnabled(boolean var1);

@Deprecated
public abstract boolean getLightTouchEnabled();

//WebView是否支持HTML的“viewport”标签或者使用wide viewport。设置值为true时,布局的宽度总是与WebView控件上的设备无关像素(device-dependent pixels)宽度一致。当值为true且页面包含viewport标记,将使用标签指定的宽度。如果页面不包含标签或者标签没有提供宽度,那就使用wide viewport。
public abstract void setUseWideViewPort(boolean var1);


//设置WebView是否支持多窗口。如果设置为true,主程序要实现onCreateWindow(WebView, boolean, boolean, Message),默认false。
public abstract void setSupportMultipleWindows(boolean var1);

//设置布局,会引起WebView的重新布局(relayout),默认值NARROW_COLUMNS
public abstract void setLayoutAlgorithm(WebSettings.LayoutAlgorithm var1);

//设置标准字体集的名字,默认值“sans-serif”。
public abstract void setStandardFontFamily(String var1);

//设置固定的字体集的名字,默认为”monospace”。
public abstract void setFixedFontFamily(String var1);

//设置无衬线字体集(sans-serif font family)的名字。默认值”sans-serif”.
public abstract void setSansSerifFontFamily(String var1);

//设置衬线字体集(serif font family)的名字,默认“sans-serif”。
public abstract void setSerifFontFamily(String var1);

//设置WebView字体库字体,默认“cursive”
public abstract void setCursiveFontFamily(String var1);

//设置fantasy字体集(font family)的名字默认为“fantasy”
public abstract void setFantasyFontFamily(String var1);

//设置最小的字号,默认为8
public abstract void setMinimumFontSize(int var1);

//设置最小的本地字号,默认为8。
public abstract void setMinimumLogicalFontSize(int var1);

//设置默认的字体大小,默认16,可取值1到72
public abstract void setDefaultFontSize(int var1);

//设置默认固定的字体大小,默认为16,可取值1到72
public abstract void setDefaultFixedFontSize(int var1);

//WebView是否下载图片资源,默认为true。注意,该方法控制所有图片的下载,包括使用URI嵌入的图片(使用setBlockNetworkImage(boolean) 只控制使用网络URI的图片的下载)。如果该设置项的值由false变为true,WebView展示的内容所引用的所有的图片资源将自动下载。
public abstract void setLoadsImagesAutomatically(boolean var1);

//是否禁止从网络(通过http和https URI schemes访问的资源)下载图片资源,默认值为false。注意,除非getLoadsImagesAutomatically()返回true,否则该方法无效。还请注意,即使此项设置为false,使用setBlockNetworkLoads(boolean)禁止所有网络加载也会阻止网络图片的加载。当此项设置的值从true变为false,WebView当前显示的内容所引用的网络图片资源会自动获取。
public abstract void setBlockNetworkImage(boolean var1);

//是否禁止从网络下载数据,如果app有INTERNET权限,默认值为false,否则默认为true。使用setBlockNetworkImage(boolean) 只会禁止图片资源的加载。注意此值由true变为false,当前WebView展示的内容所引用的网络资源不会自动加载,直到调用了重载。如果APP没有INTERNET权限,设置此值为false会抛出SecurityException。
public abstract void setBlockNetworkLoads(boolean var1);

//设置WebView是否允许执行JavaScript脚本,默认false,不允许。
public abstract void setJavaScriptEnabled(boolean var1);

//是否允许运行在一个file schema URL环境下的JavaScript访问来自其他任何来源的内容,包括其他file schema URLs. 参见setAllowFileAccessFromFileURLs(boolean),为了确保安全,应该设置为不允许,注意这项设置只影响对file schema 资源的JavaScript访问,其他形式的访问,例如来自图片HTML单元的访问不受影响。为了防止相同的域策略(same domain policy)对ICE_CREAM_SANDWICH以及更老机型的侵害,应该显式地设置此值为false。ICE_CREAM_SANDWICH_MR1 以及更老的版本此默认值为true,JELLY_BEAN以及更新版本此默认值为false
public abstract void setAllowUniversalAccessFromFileURLs(boolean var1);

//是否允许运行在一个URL环境(the context of a file scheme URL)中的JavaScript访问来自其他URL环境的内容,为了保证安全,应该不允许。也请注意,这项设置只影响对file schema 资源的JavaScript访问,其他形式的访问,例如来自图片HTML单元的访问不受影响。为了防止相同的域策略(same domain policy)对ICE_CREAM_SANDWICH以及更老机型的侵害,应该显式地设置此值为false。
public abstract void setAllowFileAccessFromFileURLs(boolean var1);

@Deprecated
public abstract void setPluginState(WebSettings.PluginState var1);

@Deprecated
public abstract void setDatabasePath(String var1);

//定位数据库的保存路径,为了确保定位权限和缓存位置的持久化,该方法应该传入一个应用可写的路径。
public abstract void setGeolocationDatabasePath(String var1);

//应用缓存API是否可用,默认值false, 结合setAppCachePath(String)使用。
public abstract void setAppCacheEnabled(boolean var1);

//设置应用缓存文件的路径。为了让应用缓存API可用,此方法必须传入一个应用可写的路径。该方法只会执行一次,重复调用会被忽略。
public abstract void setAppCachePath(String var1);

@Deprecated
public abstract void setAppCacheMaxSize(long var1);

public abstract void setDatabaseEnabled(boolean var1);

public abstract void setDomStorageEnabled(boolean var1);

public abstract boolean getDomStorageEnabled();

/** @deprecated */
@Deprecated
public abstract String getDatabasePath();

//数据库存储API是否可用,默认值false。如何正确设置数据存储API参见setDatabasePath(String)。该设置对同一进程中的所有WebView实例均有效。注意,只能在当前进程的任意WebView加载页面之前修改此项,因为此节点之后WebView的实现类可能会忽略该项设置的改变。
public abstract boolean setDatabaseEnabled();

//定位是否可用,默认为true。请注意,为了确保定位API在WebView的页面中可用,必须遵守如下约定: 
//(1) app必须有定位的权限,参见ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION; 
//(2) app必须提供onGeolocationPermissionsShowPrompt(String, GeolocationPermissions.Callback)回调方法的实现,在页面通过JavaScript定位API请求定位时接收通知。 
//作为可选项,可以在数据库中存储历史位置和Web初始权限,参见setGeolocationDatabasePath(String).
public abstract void setGeolocationEnabled(boolean var1);

@Deprecated
public abstract WebSettings.PluginState getPluginState();

//让JavaScript自动打开窗口,默认false。适用于JavaScript方法window.open()。
public abstract void setJavaScriptCanOpenWindowsAutomatically(boolean var1);

//设置默认的字符编码集,默认”UTF-8”.
public abstract void setDefaultTextEncodingName(String var1);

//设置WebView的用户代理字符串。如果字符串为null或者empty,将使用系统默认值。注意从KITKAT版本开始,加载网页时改变用户代理会让WebView再次初始化加载。
public abstract void setUserAgentString(String var1);

//没有,不能调用.有getUserAgentString().
public static String getDefaultUserAgent(Context context) {
    throw new RuntimeException("Stub!");
}

//调用requestFocus(int, Android.graphics.Rect)时是否需要设置节点获取焦点,默认值为true。
public abstract void setNeedInitialFocus(boolean var1);

@Deprecated
public abstract void setRenderPriority(WebSettings.RenderPriority var1);

//重写使用缓存的方式,默认值LOAD_DEFAULT。缓的存使用方式基于导航类型,正常的页面加载,检测缓存,需要时缓存内容复现。导航返回时,内容不会复现,只有内容会从缓存盘中恢复。该方法允许客户端通过指定LOAD_DEFAULT, LOAD_CACHE_ELSE_NETWORK, LOAD_NO_CACHE or LOAD_CACHE_ONLY的其中一项来重写其行为。
public abstract void setCacheMode(int var1);

//当一个安全的来源(origin)试图从一个不安全的来源加载资源时配置WebView的行为。默认情况下,KITKAT及更低版本默认值为MIXED_CONTENT_ALWAYS_ALLOW,LOLLIPOP版本默认值MIXED_CONTENT_NEVER_ALLOW,WebView首选的最安全的操作模式为MIXED_CONTENT_NEVER_ALLOW ,不鼓励使用MIXED_CONTENT_ALWAYS_ALLOW。
public abstract void setMixedContentMode(int var1);

//当WebView切换到后台但仍然与窗口关联时是否raster tiles,打开它可以避免在WebView从后台切换到前台时重新绘制,默认值false。在这种模式下后台的WebView占用更多的内存。请按如下准则显示内存的使用:

WebView的尺寸不能比设备的屏幕尺寸更大;
限制在少数WebView上使用该模式;
在可见的WebView和即将显现的WebView上使用;
public abstract void setOffscreenPreRaster(boolean var1);



2、WebViewClient

方法:
//在点击请求的是链接是才会调用,重写此方法返回true表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边.
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    throw new RuntimeException("Stub!");
}

//在页面加载开始时调用。
public void onPageStarted(WebView view, String url, Bitmap favicon) {
    throw new RuntimeException("Stub!");
}

//在页面加载结束时调用。
public void onPageFinished(WebView view, String url) {
    throw new RuntimeException("Stub!");
}

//在加载页面资源时会调用,每一个资源(比如图片)的加载都会调用一次。
public void onLoadResource(WebView view, String url) {
    throw new RuntimeException("Stub!");
}

public void onPageCommitVisible(WebView view, String url) {
    throw new RuntimeException("Stub!");
}

/** @deprecated */
@Deprecated
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
    throw new RuntimeException("Stub!");
}

public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
    throw new RuntimeException("Stub!");
}

/** @deprecated */
@Deprecated
public void onTooManyRedirects(WebView view, Message cancelMsg, Message continueMsg) {
    throw new RuntimeException("Stub!");
}

/** @deprecated */
@Deprecated
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
    throw new RuntimeException("Stub!");
}

public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
    throw new RuntimeException("Stub!");
}

public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
    throw new RuntimeException("Stub!");
}

//如果浏览器需要重新发送POST请求,可以通过这个时机来处理。默认是不重新发送数据。
public void onFormResubmission(WebView view, Message dontResend, Message resend) {
    throw new RuntimeException("Stub!");
}

//通知应用程序可以将当前的url存储在数据库中,意味着当前的访问url已经生效并被记录在内核当中。这个函数在网页加载过程中只会被调用一次。注意网页前进后退并不会回调这个函数。
public void doUpdateVisitedHistory(WebView view, String url, boolean isReload) {
    throw new RuntimeException("Stub!");
}

//当网页加载资源过程中发现SSL错误会调用此方法。我们应用程序必须做出响应,是取消请求handler.cancel(),还是继续请求handler.proceed();内核的默认行为是handler.cancel();
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
    throw new RuntimeException("Stub!");
}

public void onReceivedClientCertRequest(WebView view, ClientCertRequest request) {
    throw new RuntimeException("Stub!");
}

//通知应用程序WebView接收到了一个Http auth的请求,应用程序可以使用supplied 设置webview的响应请求。默认行为是cancel 本次请求。
public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {
    throw new RuntimeException("Stub!");
}

//提供应用程序同步一个处理按键事件的机会,菜单快捷键需要被过滤掉。如果返回true,webview不处理该事件,如果返回false, webview会一直处理这个事件,因此在view 链上没有一个父类可以响应到这个事件。默认行为是return false;
public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
    throw new RuntimeException("Stub!");
}

/** @deprecated */
@Deprecated
public void onUnhandledKeyEvent(WebView view, KeyEvent event) {
    throw new RuntimeException("Stub!");
}

public void onUnhandledInputEvent(WebView view, InputEvent event) {
    throw new RuntimeException("Stub!");
}

//通知应用程序webview 要被scale。应用程序可以处理改事件,比如调整适配屏幕。
public void onScaleChanged(WebView view, float oldScale, float newScale) {
    throw new RuntimeException("Stub!");
}

//通知应用程序有个自动登录的帐号过程
public void onReceivedLoginRequest(WebView view, String realm, String account, String args) {
    throw new RuntimeException("Stub!");
}

3、WebChromeClient

方法:
//通知应用程序当前网页加载的进度
public void onProgressChanged(WebView view, int newProgress) {
    throw new RuntimeException("Stub!");
}

//获取网页title标题
public void onReceivedTitle(WebView view, String title) {
    throw new RuntimeException("Stub!");
}

//获取网页Icon
public void onReceivedIcon(WebView view, Bitmap icon) {
    throw new RuntimeException("Stub!");
}

//如果应用程序需要这个icon的话, 可以通过这个url获取得到 icon。
public void onReceivedTouchIconUrl(WebView view, String url, boolean precomposed) {
    throw new RuntimeException("Stub!");
}

//通知应用程序webview需要显示一个custom view,主要是用在视频全屏HTML5Video support。
public void onShowCustomView(View view, WebChromeClient.CustomViewCallback callback) {
    throw new RuntimeException("Stub!");
}

/** @deprecated */
@Deprecated
public void onShowCustomView(View view, int requestedOrientation, WebChromeClient.CustomViewCallback callback) {
    throw new RuntimeException("Stub!");
}

//退出视频通知
public void onHideCustomView() {
    throw new RuntimeException("Stub!");
}

//请求创建一个新的窗口,如果我们应用程序接管这个请求,必须返回true,并且创建一个新的webview来承载主窗口。
如果应用程序不处理,则需要返回false,默认行为和返回false表现一样。
public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
    throw new RuntimeException("Stub!");
}

//webview请求得到focus,发生这个主要是当前webview不是前台状态,是后台webview。
public void onRequestFocus(WebView view) {
    throw new RuntimeException("Stub!");
}

//通知应用程序从关闭传递过来的webview并从view tree中remove。
public void onCloseWindow(WebView window) {
    throw new RuntimeException("Stub!");
}

//通知应用程序显示javascript alert对话框,如果应用程序返回true内核认为应用程序处理这个消息,返回false,内核自己处理。
//Tips: 如果我们应用接管处理, 则必须给出result的结果,result.cancel,result.comfirm必须调用其中之后,否则内核会hang住。
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
    throw new RuntimeException("Stub!");
}

//通知应用程序提供confirm 对话框。
public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
    throw new RuntimeException("Stub!");
}

//通知应用程序显示一个prompt对话框。 
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
    throw new RuntimeException("Stub!");
}

//通知应用程序显示一个对话框,让用户选择是否离开当前页面,这个回调是javascript中的onbeforeunload事件,如果客户端返回true,内核会认为客户端提供对话框。默认行为是return false。
public boolean onJsBeforeUnload(WebView view, String url, String message, JsResult result) {
    throw new RuntimeException("Stub!");
}

/** @deprecated */
@Deprecated
public void onExceededDatabaseQuota(String url, String databaseIdentifier, long quota, long estimatedDatabaseSize, long totalQuota, QuotaUpdater quotaUpdater) {
    throw new RuntimeException("Stub!");
}

/** @deprecated */
@Deprecated
public void onReachedMaxAppCacheSize(long requiredStorage, long quota, QuotaUpdater quotaUpdater) {
    throw new RuntimeException("Stub!");
}

//当前页面请求是否允许进行定位。
public void onGeolocationPermissionsShowPrompt(String origin, Callback callback) {
    throw new RuntimeException("Stub!");
}

public void onGeolocationPermissionsHidePrompt() {
    throw new RuntimeException("Stub!");
}

public void onPermissionRequest(PermissionRequest request) {
    throw new RuntimeException("Stub!");
}

public void onPermissionRequestCanceled(PermissionRequest request) {
    throw new RuntimeException("Stub!");
}

/** @deprecated */
@Deprecated
public boolean onJsTimeout() {
    throw new RuntimeException("Stub!");
}

/** @deprecated */
@Deprecated
public void onConsoleMessage(String message, int lineNumber, String sourceID) {
    throw new RuntimeException("Stub!");
}

public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
    throw new RuntimeException("Stub!");
}

public Bitmap getDefaultVideoPoster() {
    throw new RuntimeException("Stub!");
}

public View getVideoLoadingProgressView() {
    throw new RuntimeException("Stub!");
}

public void getVisitedHistory(ValueCallback<String[]> callback) {
    throw new RuntimeException("Stub!");
}

public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
    throw new RuntimeException("Stub!");
}

相关文章

网友评论

    本文标题:WebView详解(一)

    本文链接:https://www.haomeiwen.com/subject/kqtvsttx.html