WebView API指南

WebView可以显示网页视图,它使用WebKit渲染引擎来显示网页,并提供了前后导航,放大和缩小,执行文本搜索等功能。

  • 基本用法
    默认情况下,webView只提供显示网页的基础功能,不提供像浏览器那样的插件与脚本。如果想让用户与网页有大量的交互,那么就用意图,打开浏览器吧。
 Uri uri = Uri.parse("https://www.example.com");
 Intent intent = new Intent(Intent.ACTION_VIEW, uri);
 startActivity(intent);
  • 使用WebView
    可以在Layout中添加,也可以在onCreate()期间,将Activity设置为WebView()
WebView webview = new WebView(this);
setContentView(webview);
  • 加载所需要的网页
webview.loadUrl("https://example.com/");
 String summary = "<html><body>You scored <b>192</b> points.</body></html>";
 webview.loadData(summary, "text/html", null);
  • WebView提供了一些自定义的方法,我们可以添加自己的行为:

    1. 创建 WebChromeClient 类,当浏览器的UI有一些事件,这个类会回调过来,例如:进度的更新与弹窗。
    2. 创建 WebViewClient 类,我们可以在这里拦截URL的加载shouldOverrideUrlLoading()
    3. 通过设置WebSettings,启用JavaScrip,setJavaScriptEnabled()
    4. 使用addJavascriptInterface(Object,String)方法将Java对象注入WebView。这个方法允许我们将Java对象注入到JavaScript的上下文中,这样我们就可以在页面中使用JavaScript调用java对象了。

    下面是一个显示错误处理、设置和进度通知:

//在标题栏显示进度
 getWindow().requestFeature(Window.FEATURE_PROGRESS);

 webview.getSettings().setJavaScriptEnabled(true);

 final Activity activity = this;
 webview.setWebChromeClient(new WebChromeClient() {
   public void onProgressChanged(WebView view, int progress) {

     activity.setProgress(progress * 1000);
   }
 });
 webview.setWebViewClient(new WebViewClient() {
   public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
     Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show();
   }
 });

 webview.loadUrl("https://https://github.com/google/gson/");
  • Zoom
    WebSettings.setBuiltInZoomControls(boolean)内置的缩放控件。若为false,则该WebView不可缩放
    避免zoom失效,我们尽量不定义webview的宽,高设置WRAP_CONTENT。

  • Cookie和窗口管理

    • 我们的应用可以设置cookie,而且不与浏览器里面的cookie共享
    • 默认情况下,在HTML网页中请求(不管是脚本请求还是链接地址打开的)新的窗口都是被忽略的,
      但是我们可以通过自定义WebChromeClient来打开多个窗口,如何打开与渲染都由我们自己来配置
    • 设备屏幕方向与其他配置更改的时候,Android 会重启正在运行的 Activity(先后调用 onDestroy() 和 onCreate())。那么WebView也会重新加载数据。如果你不想这样,你的Activity可以设置orientation and keyboardHidden。这样Activity 始终会自行处理此配置变更。
  • 让网页适配不同的屏幕密度
    Android将所有实际的屏幕密度分为三种:高,中,低密度。

    默认情况下,WebView会缩放网页,使其以与中等密度屏幕上的默认外观相匹配的尺寸绘制。因此,它在高密度屏幕上应用1.5倍缩放(因为其像素较小),在低密度屏幕上缩放0.75倍(因为其像素较大)。

    以下是可用于处理不同屏幕密度的功能摘要:

  • window.devicePixelRatioDOM
    此属性的值指定用于当前设备的默认比例值。例如,如果值为window.devicePixelRatio“1.0”,则设备被认为是中等密度(mdpi)设备,并且默认不缩放网页。

  • -webkit-device-pixel-ratioCSS
    使用此选项指定要使用此样式表的屏幕密度。相应的值应该是“0.75”,“1”或“1.5”,以表示样式分别适用于低密度,中等密度或高密度屏幕的设备。

  • <link rel = “stylesheet” media = “screen and(-webkit-device-pixel-ratio:1.5)” href = “hdpi.css”/>
    该hdpi.css样式表仅用于与1.5的屏幕像素比,这是高密度的像素比例的设备。

  • HTML5 视频支持
    需要打开硬件加速来支持(这个我不建议这样做)。

  • 全屏支持
    如果要支持视频或者HTML - 我们需要设置 WebChromeClient然后实现两个方法
    onShowCustomView(View, WebChromeClient.CustomViewCallback)onHideCustomView()。如果缺少这两种方法中的任何一种,网页内容将不被允许进入全屏。

  • HTML5地理定位API支持
    对于面向Android N及更高版本(API级别> M)的应用程序,地理位置api仅支持安全的来源,如https。对于这样的应用程序,请求在非安全来源的地理定位API会自动被拒绝,而不会调用相应的 onGeolocationPermissionsShowPrompt(String, GeolocationPermissions.Callback) 方法。

  • 布局大小
    建议将WebView布局高度设置为固定值, MATCH_PARENT而不是使用 WRAP_CONTENT。当高度是MATCH_PARENT时,WebView的父布局不应该使用 WRAP_CONTENT高度,因为这可能会导致视图的大小不正确。

    如果使用WRAP_CONTENT作为布局宽度。那么WebView将会使用父宽度。


API

addJavascriptInterface
void addJavascriptInterface (Object object, String name)
将Java对象注入到WebView中,使用Java对象提供的名字注入到JavaScript的上下文中,这样JavaScript就可以访问Java对象的方法了。

class JsObject {
//不要漏掉这个注解
    @JavascriptInterface
    public String toString() { return "injectedObject"; }
 }
 webview.getSettings().setJavaScriptEnabled(true);
 webView.addJavascriptInterface(new JsObject(), "injectedObject");
 webView.loadData("", "text/html", null);
 webView.loadUrl("javascript:alert(injectedObject.toString())");

autofill(added in API level 26)
void autofill (SparseArray<AutofillValue> values)
自动填充视图的方法,我的理解是自动填充一些表单什么的。

canGoBack
boolean canGoBack()
获取该WebView是否能够退到历史页面,如果该WebView有返回历史记录的项,则返回true。

canGoBackOrForward
boolean canGoBackOrForward(int steps)
以当前的页面为起始点,用来确认WebView的历史记录是否足以后退或前进给定的步数。steps正数是前进,负数是后退。

canGoForward
boolean canGoForward()
用来确认WebView里是否有历史记录项

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (mWebView.canGoBack()) {
      mWebView.goBack();
      return true;
  }
}

canZoomIn
此方法在API级别17中已被弃用,可以使用 onScaleChanged(WebView, float, float)
boolean canZoomIn()
获取此WebView是否可以放大。可以放大就返回true。

canZoomOut
此方法在API级别17中已被弃用,可以使用 onScaleChanged(WebView, float, float)
boolean canZoomOut()
获取此WebView是否可以缩小,可以缩小就返回true。

capturePicture
这种方法在API级别19中已被弃用,可以使用使用onDraw(Canvas)获得的WebView的位图快照,或 saveWebArchive(String)保存内容的文件。
Picture capturePicture ()
捕获此WebView的当前内容显示成图片。捕获的图片会显示整个网页,并不局限于当前的区域。

//获取Picture对象
Picture picture = mWebView.capturePicture();
int width = picture.getWidth();
int height = picture.getHeight();
//创建Bitmap对象
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
picture.draw(canvas);

clearCache
void clearCache (boolean includeDiskFiles)
清除资源缓存。注意:缓存是按应用程序进行的,因此这将清除所有WebView的缓存。includeDiskFiles如果为false,那么只清除RAM缓存。

clearClientCertPreferences(added in API level 26)
void clearClientCertPreferences(Runnable onCleared)
清除存储的客户端证书,Runnable运行在UI线程,也可以传入null。

clearFormData
void clearFormData()
清除自动完成填充的表单数据。需要注意的是,该方法仅仅清除填充的表单数据,并不会清除WebView存储到本地的数据。

clearHistory
void clearHistory ()
清除历史记录,这样就不能前进后退了。

clearMatches
void clearMatches()
清除通过findAllAsync(String)匹配的高亮文本。

clearSslPreferences
void clearSslPreferences()
清除存储的SSL首选项表。

clearView
在API18已经弃用,使用WebView.loadUrl(“about:blank”)可以正确地重置视图状态并释放页面资源(包括正在运行的所有的JavaScript)。
void clearView ()
清除WebView,只会留下白色背景。

computeScroll
void computeScroll ()
由父类调用,请求子类在必要时更新mScrollX和mScrollY的值。(从来没有用过)

copyBackForwardList
CopyBackForwardList()
获取此WebView的WebBackForwardList,这个列表包含了查询历史堆栈中的每个项目的后退/前进列表。(从来没有用过)

createPrintDocumentAdapter
PrintDocumentAdapter createPrintDocumentAdapter(String documentName)
为你的WebView提供打印功能,PrintDocumentAdapter会将WebView内容转换成PDF。参数documentName,具体可以查看 PrintDocumentInfo(从来没有用过)。

createWebMessageChannel(added in API level 23)
WebMessagePort[] createWebMessageChannel ()
创建与JS通信的消息通道,HTML5消息通道的功能(不懂这是什么)

destroy
void destroy ()
从视图树中删除此WebView之后,再调用此方法。

rootView.removeView(webView);
webView.destroy();

dispatchKeyEvent
boolean dispatchKeyEvent (KeyEvent event)
将按键事件分发到焦点路径上的下一个视图。该路径指的是从视图树的顶部向下延伸到当前有焦点的视图。如果这个View有焦点,那么就分发给自己。KeyEvent 指的是按键事件。

documentHasImages
void documentHasImages (Message response)
文档中是否有图像,参数Message负责发送结果消息

enableSlowWholeDocumentDraw(added in API level 21)
void enableSlowWholeDocumentDraw ()
WebView新添加的功能,会智能地绘制当前HTML文档的一部分,来减少内存占用并提高性能。

evaluateJavascript(added in API level 19)
void evaluateJavascript (String script, ValueCallback<String> resultCallback)
WebView调用JavaScript有参数有返回值的函数,此方法必须在UI线程上调用,回调也是在UI线程的。

private void evaluateJavaScript(WebView webView){
webView.evaluateJavascript("getName()", new ValueCallback<String>() {
    @Override
    public void onReceiveValue(String s) {
        Log.d("WebView",s.toString);
    }
  });
}

findAddress(只有在美国的地址才会检测到)
String findAddress (String addr)
搜索地址

findAll
API16已经弃用
int findAll(String find)
在页面上找到查找的所有字符并突出显示。只要注册了WebView.FindListener就会获得通知。返回查找到的字符串“find”的出现次数.

findAllAsync
void findAllAsync(String find)
在页面上找到查找的所有字符并且异步突出显示,通知任何注册了WebView.FindListener。

findNext
void findNext(boolean forward)
突出显示并滚动到找到的下一个匹配项 findAllAsync(String),就是一条一条的搜索文本。如果调用了clearMatches()那么这个方法就不执行了。

freeMemory
API19已弃用,现在内存不足时会自动回收
通知此WebView内存不足,释放内存。

getCertificate
SslCertificate getCertificate()
获取页面SSL证书,如果没有,就返回Null。

getContentHeight
int getContentHeight()
获取HTML内容的高度。

getFavicon
Bitmap getFavicon ()
获取当前页面的图标。

getHandler
Handler getHandler()
获取Handler

getOriginalUrl
String getOriginalUrl()
获取当前页面的原始URL。这并不一定与传递给WebViewClient.onPageStarted的URL相同,因为URL的加载已经开始,但当前页面可能还没有更改。也可能出现重定向导致原始请求的URL不同。

getProgress
int getProgress()
获取当前页面的进度(0-100)。

getSettings
WebSettings getSettings ()
获取控制WebView的对象

getTitle()
String getTitle()
获取当前页面的标题

getWebChromeClient
WebChromeClient getWebChromeClient()
获取Chrome,如果没有设置,就返回null

getWebViewClient
WebViewClient getWebViewClient()
获取WebViewClient

goBack
void goBack ()
在WebView历史记录后退到上一项

goForward
void goForward ()
在WebView历史记录里前进到下一项

invokeZoomPicker
void invokeZoomPicker()
会显示WebView的图形缩放选择器的小部件

isPrivateBrowsingEnabled
boolean isPrivateBrowsingEnabled ()
获取是否在此WebView中启用隐私浏览

loadUrl
void loadUrl(String url)
加载指定的URL

onKeyDown
boolean onKeyDown (int keyCode, KeyEvent event)
默认实现KeyEvent.Callback.onKeyDown():当视图可以点击时,执行按下视图KEYCODE_DPAD_CENTERKEYCODE_ENTER释放视图。(软件键盘上的按键通常不会触发这个监听器)如果你处理了事件,则返回true。如果您想让事件由下一个接收器处理,则返回false。

onPause
void onPause ()
暂停动画和地理位置等。请注意,此调用并不会暂停JavaScript。要想全局暂停JavaScript,请使用 pauseTimers()。要恢复WebView,请调用onResume()

onResume
void onResume ()
恢复WebView之前调用的onPause()

pageUp
pageUp(boolean top)
将WebView展示的页面滑动至顶部

pageDown
pageDown(boolean bottom)
将WebView展示的页面滑动至底部

pauseTimers
void pauseTimers ()
全局的WebView暂停请求(暂停所有WebView的布局,HTML解析和JavaScript定时器)

postUrl
void postUrl(String url,byte [] postData)
使用“POST”方法将Data加载到此WebView中。这里参数byte:数据将被传递给“POST”请求,该请求必须是“application / x-www-form-urlencoded”编码的。

postWebMessage(added in API level 23)
void postWebMessage (WebMessage message, Uri targetOrigin)
Post a message to main frame.

reload
void reload()
重新加载当前的URL

removeJavascriptInterface
void removeJavascriptInterface(String name)
从此WebView中删除以前注入的Java对象

resumeTimers
void resumeTimers()
恢复所有WebView的状态(布局的解析和JavaScript,计时器)

setFindListener
void setFindListener(WebView.FindListener listener)
注册监听器,以通知页面操作进度

setOverScrollMode
void setOverScrollMode(int mode)
为此视图设置滚动模式,只有在视图能够滚动的情况下,才能设置视图的滚动模式。

setScrollBarStyle
void setScrollBarStyle(int style)
指定滚动条的样式。滚动条可以重叠或嵌入

setWebChromeClient
void setWebChromeClient(WebChromeClient客户端)
设置chrome处理程序。这是WebChromeClient的一个实现,用于处理JavaScript对话框,网站图标,标题和进度。

setWebViewClient
void setWebViewClient (WebViewClient client)
设置WebViewClient。接收各种通知和请求。

startSafeBrowsing(added in API level 27)
void startSafeBrowsing (Context context, ValueCallback<Boolean> callback)
启动安全浏览

stopLoading
void stopLoading()
停止当前加载


解决一下内存泄漏的问题,就是这样写:

@Override
protected void onDestroy() {
 if (mWebView != null) {
            ((ViewGroup) mWebView .getParent()).removeView(mWebView);
            mWebView .destroy();
            mWebView = null;
        }
     }

看到报的内存泄漏问题,于是就开始翻API,翻的都快睡着了。
不写了,好累啊。(╯︵╰)

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值