Android开发笔记之探秘WebView

概述:
           一个显示网页的视图。这个类是你可以滚动自己的Web浏览器或在你的Activity中简单地显示一些在线内容的基础。它使用了WebKit渲染引擎来显示网页,包括向前和向后导航的方法(通过历史记录),放大和缩小,执行文本搜索等。

需要注意的是:为了让你的应用能够使用WebView访问互联网和加载网页,你必须添加Internet的权限在Android Manifest文件中:

<uses-permission android:name="android.permission.INTERNET" />

类结构:

java.lang.Object
  ↳ android.view.View
   ↳ android.view.ViewGroup
     ↳ android.widget.AbsoluteLayout
      ↳ android.webkit.WebView

常用方法:


WebSettings

getSettings()

获取设置WebView的WebSettings对象。


void

setWebViewClient(WebViewClient client)

设置将接收各种通知和请求的WebViewClient。


void

setWebChromeClient(WebChromeClient client)

设置chrome处理。

说明:

WebSettings  getSettings()获取设置WebView的WebSettings对象。

WebSettings常用方法:


方法

说明

setAllowFileAccess

启用或禁用WebView访问文件数据

setBlockNetworkImage

是否显示网络图像

setBuiltInZoomControls

设置是否支持缩放

setCacheMode

设置缓冲的模式

setDefaultFontSize

设置默认的字体大小

setDefaultTextEncodingName

设置在解码时时候用的默认编码

setFixedFontFamily

设置固定使用的字体

setJavaScriptEnabled

设置是否支持Javascript

setLayoutAlgorithm

设置布局方式

setLightTouchEnabled

设置用鼠标激活被选项

setSupportZoom

设置是否支持变焦

void  setWebViewClient(WebViewClient client)

设置将接收各种通知和请求的WebViewClient。

WebViewClient 常用方法:


方法

说明

doUpdateVisitedHistory

更新历史记录

onFormResubmission

应用程序重新请求网页数据

onLoadResource

加载指定地址提供的资源

onPageFinished

网页加载完毕

onPageStarted

网页开始加载

onReceivedError

报告错误信息

onScaleChanged

WebView发生改变

shouldOverrideUrlLoading

控制新的连接在当前WebView中打开

void  setWebChromeClient(WebChromeClient client) 设置chrome处理。

WebChromeClient常用方法:


方法

说明

onCloseWindow

关闭WebView

onCreateWindow

创建WebView

onJsAlert

处理Javascript中的Alert对话框

onJsConfirm

处理Javascript中的Confirm对话框

onJsPrompt

处理Javascript中的Prompt对话框

onProgressChanged

加载进度条改变

onReceivedlcon

网页图标更改

onReceivedTitle

网页Title更改

onRequestFocus WebView

显示焦点

自定义WebView,你可以添加你自己的行为:
创建和设置WebChromeClient子类。当一些可能影响浏览器的用户界面发生了,例如,进度更新和JavaScript警报送到这里(见调试任务)调用这个类。
创建和设置WebViewClient子类。当影响内容呈现的事情发生是调用这个类,例如,错误或表单提交。您也可以拦截的URL加载到这里(通过shouldOverrideUrlLoading())。
修改WebSettings,如以setJavaScriptEnabled()方式启用JavaScript。
将Java对象通过addJavascriptInterface(Object,String)方法注射到WebView。 这方法允许您将Java对象注入到一个页面的JavaScript上下文,这样他们可以通过JavaScript访问的页面。
下面是一个更加复杂的例子,显示错误处理,设置和进展通知:

// Let's display the progress in the activity title bar, like the
// browser appdoes.
getWindow().requestFeature(Window.FEATURE_PROGRESS);
webview.getSettings().setJavaScriptEnabled(true);
final Activity activity = this;
webview.setWebChromeClient(new WebChromeClient() {
 public void onProgressChanged(WebView view, int progress) {
  //Activities and WebViews measure progress with different scales.
  //The progress meter will automatically disappear when we reach 100%
  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("http://developer.android.com/");

缩放:
        可以通过 设置 WebSettings.setBuiltInZoomControls(boolean) ,启用内置缩放。

注意:使用缩放,如果不是高度或宽度设置为WRAP_CONTENT可能会导致不确定的行为,应该避免。

Cookie 和窗口管理:
        出于显而易见的安全原因,您的应用程序都有自己的缓存,cookie存储等,它不共享浏览器应用程序的数据。

默认情况下,通过HTML请求打开新的窗口将被忽略。这是确切的它们是被JavaScript打开还是被目标链接打开。您可以自定义您的WebChromeClient提供自己的行为打开多个窗口,并使用你想要的任何方式渲染它们。

WebView中构建Web应用程序:      
      如果你想提供一个Web应用程序(或只是一个网页)作为客户端应用程序的一部分,你可以使用WebView做到这一点。WebView类是Android的View类的一个扩展,它可以让你显示网页作为你的活动布局的一部分。它不包括一个完全开发的Web浏览器的任何功能,如导航控件或一个地址栏。所有的WebView默认情况下是显示一个Web页面。

一个使用WebView的常见的场景:是当你想要在你的应用程序中提供可能需要更新的信息,如一个终端用户协议或用户指南,那么使用WebView是很有帮助的。 在你的Android应用程序中你可以创建一个包含WebView的Activity然后用它来显示的在线托管的文档。

另一个使用WebView的常见的场景:是如果你的应用程序提供的数据总是需要从Internet上获取,如电子邮件。在这种情况下,你可能会发现它更容易在你的Android应用程序,显示所有的用户数据的网页,而不是执行一个网络请求,然后解析​​数据,并渲染它在Android的布局,以建立一个WebView。相反,你可以设计的专为Android设备的网页,然后实施的WebView在你的Android应用程序加载的网页。

下面将向你展示如何开始使用WebView,以及如何做一些额外的事情,比如在你的Android应用程序中处理页面导航和从网页上绑定JavaScript到客户端的代码。

基本用法:
       默认情况下,WebView不提供类似浏览器的窗口小部件,不启用JavaScript和网页错误被忽略。如果你的目的只是显示一些HTML作为用户界面的一部分,这也许还不错;用户将不再需要与网页进行交互阅读,并且该网页将不需要与用户进行交互。如果你需要一个全面的Web浏览器,那么你可能要调用浏览器应用程序来加载URL,而不是用WebView中显示它。例如:

1)        在你的APP中添加一个WebView:

<?xml version="1.0" encoding="utf-8"?>
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/webview"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
/>

2)        使用loadUrl()方法加载一个web页面:

WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.loadUrl("http://www.example.com");

3)        给应用程序添加访问网络的权限:

<manifest ... >
  <uses-permission android:name="android.permission.INTERNET" />
</manifest>

以上就是显示一个最基本的web页面所有的步骤。
在WebView中使用JavaScript :
       如果你计划在你的WebView加载网页时使用JavaScript,你必须为你的WebView启用JavaScript。一旦启用JavaScript,你还可以创建你的应用程序代码和JavaScript代码之间的接口。

JavaScript在WebView中默认情况下是被禁用的。你可以通过附加在WebView上的WebSettings启用它。即使用getSettings()获取WebSettings       ,然后启用使用setJavaScriptEnabled()方法启用JavaScript。

WebView myWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);

JavaScript代码绑定到Android代码:
        在开发一个web应用程序,专门设计的WebView在你的Android应用程序中,您可以创建您的JavaScript代码和客户端Android代码之间的接口。例如,您的JavaScript代码可以在你的Android代码中调用一个方法来显示Dialog,而不是使用JavaScriptalert()方法。

调用addJavascriptInterface()方法绑定一个新的JavaScript和Android代码之间的接口。通过它 一个类实例绑定到你的JavaScrip,JavaScript可以调用一个接口名称访问类。

public class WebAppInterface {
  Context mContext;
  /** Instantiatethe interface and set the context */
  WebAppInterface(Context c) {
    mContext = c;
  }
  /** Show a toastfrom the web page */
  @JavascriptInterface
  public void showToast(String toast) {
    Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
  }
}

注意:如果你设置的targetSdkVersion为17或更高,则必须添加@JavascriptInterface为任何您想要提供给您的JavaScript(该方法必须是public)方法添加标注。如果你不提供注解,在Android4.2或更高版本上运行时该方法是不能被网页访问的。
       在上面这个例子中,WebAppInterface 类允许网页调用showToast()方法创建一个Toast 消息。

你可以通过addJavascriptInterface()方法和Android接口名,绑定这个类到运行在你的WebView中的JavaScript上。

WebView webView = (WebView) findViewById(R.id.webview);
webView.addJavascriptInterface(new WebAppInterface(this), "Android"); 

这将为运行在WebView中的JavaScript创建一个名为Android的接口。在这一点上,Web应用程序可以访问WebAppInterface类。例如,下面是一些HTML和JavaScript在单击按钮的时候将创建一个Toast消息。

<input type="button" value="Sayhello" onClick="showAndroidToast('Hello Android!')" />
<script type="text/javascript">
  function showAndroidToast(toast) {
    Android.showToast(toast);
  }
</script>

这不需要从JavaScript接口初始化Android。 WebView自动的将它应用到你的web页面中。 因此,按下按钮showAndroidToast()方法使用Android接口调用WebAppInterface.showToast()方法。
注:绑定到你的JavaScript对象运行在另一个线程,而不是在它构建的线程。

警告:使用addJavascriptInterface()将允许 JavaScript来控制你的Android应用程序。 这是一个非常有用的特性或危险的安全问题。 当WebView的HTML是不值得信任的(例如,部分或全部的HTML是由一个不知名的人或进程提供的),那么攻击将者执行包括在HTML和选择的任何客户端代码。因此,不应该使用addJavascriptInterface()除非你写的所有HTML和JavaScript出现在你WebView。 你应该也不允许用户导航到其他不是自己的网页,,在你的WebView内(相反,允许用户的通过默认浏览器应用程序打开外部链接。应用的web浏览器打开所有的URL链接,所以要小心你只有在处理页面导航中描述以下部分)。

处理页面导航:
      当用户单击在WebView上的链接时,默认行为是启动一个处理URL的Android应用。通常默认网页浏览器打开和装在目的URL。但是你可以为WebView覆盖这个行为,以便在你的WebView上打开链接。然后,您可以允许用户前后浏览通过的由您的WebView保留的网页历史记录。

要打开用户点击链接,只是提供一个WebViewClient为您的WebView,使用setWebViewClient()。

WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.setWebViewClient(new WebViewClient());

这样。用户点击的所有的链接,都在你的WebView上加载。
如果你想更多的控制点击链接的加载,创建自己的WebViewClient的覆盖shouldOverrideUrlLoading()方法。

private class MyWebViewClient extends WebViewClient {
  @Override
  public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (Uri.parse(url).getHost().equals("www.example.com")) {
      // This is my web site, so do not override;let my WebView load the page
      return false;
    }
    // Otherwise, the link is not for a page on my site, so launch anotherActivity that handles URLs
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
    startActivity(intent);
    return true;
  }
}

然后为WebView创建一个新的WebViewClient实例:

WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.setWebViewClient(new MyWebViewClient());

现在,当用户点击一个链接时,系统调用shouldOverrideUrlLoading(),它会检查URL主机是否一个特定的域相匹配(定义如上)。如果不匹配,那么为了不重写的URL加载(它允许WebView加载的URL照常)方法返回false。如果URL中的主机不匹配,那么 一个Intent将被创建启动默认的Activity 处理URL(它可以解决用户的默认Web浏览器)。
浏览网页的历史记录:
     当你的WebView重载URL加载的时,WebView会自动累加访问过的网页的历史记录。您可以通过goBack()和 goForward()方法向后、向前浏览。

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
  // Check if thekey event was the Back button and if there's history
  if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) {
    myWebView.goBack();
    return true;
  }
  // If it wasn'tthe Back key or there's no web page history, bubble up to the default
  // systembehavior (probably exit the activity)
  return super.onKeyDown(keyCode, event);
}

如果有一个实际的网页历史记录用户访问的canGoBack()方法返回true。同样地,你可以使用canGoForward()来检查是否有历史前进。如果不执行此检查,那么一旦用户到达历史的终结,GoBack()或goForward()什么也不做。

(0)

相关推荐

  • Android WebView 应用界面开发教程

    WebView组件本身就是一个浏览器实现,Android5.0增强的WebView基于Chromium M37,直接支持WebRTC.WebAudio.WebGL.开发者可以直接在WebView中使用聚合(Polymer)和Material设计. 一.WebView浏览网页(加载线上URL) WebView提供了很多方法执行浏览器操作,常用方法如下: void goBack():后退 void goForward():前进. void goBackOrForward(int step):step

  • Android开发之WebView组件的使用解析

    在 Android 手机中内置了一款高性能 webkit 内核浏览器, SDK 中封装为一个叫做 WebView 组件. WebView 类是 WebKit 模块 Java 层的视图类,( 所有需要使用 Web 浏览功能的Android应用程序都要创建该视图对象显示和处理请求的网络资源.目前,WebKit 模块支持 HTTP.HTTPS.FTP 以及 javascript 请求. WebView 作为应用程序的 UI 接口,为用户提供了一系 列的网页浏览.用户交互接口,客户程序通过这些接口访问

  • Android应用开发中WebView的常用方法笔记整理

    基本使用 使用WebView通常是需要网络的,所以需要加上访问网络的权限 <uses-permission android:name="android.permission.INTERNET" /> 1.加载某个url的方法 WebView.loadUrl("http://www.baidu.com"); 需要注意的是不要省略前面的http://,省略的话,某些ROM中的WebView会加载失败 2.加载assets中的HTML WebView.load

  • Android程序开发之WebView使用总结

    前言: 今天修改项目中一个有关WebView使用的bug,激起了我总结WebView的动机,今天抽空做个总结. 使用场景: 1.)添加权限 <uses-permission android:name="android.permission.INTERNET" /> 2.)布局文件 <WebView android:id="@+id/webView" android:layout_width="match_parent" andr

  • Android开发之WebView输入框提示解决办法

    做基于WebView应用时,页面上有一个输入框,当输入的文字过多时,超过输入框的行数时,输入框能够滚动,这时间问题来了,输入的提示箭头会移动到输入框外,如何解决这个问题呢,查找chromium源码如下: void LoadIfNecessary(jobject context) { if (loaded_) return; loaded_ = true; TRACE_EVENT0("browser", "HandleResources::Create"); JNIE

  • Android开发学习笔记 浅谈WebView

    第一种方法的步骤: 1.在要Activity中实例化WebView组件:WebView webView = new WebView(this); 2.调用WebView的loadUrl()方法,设置WevView要显示的网页:   互联网用:webView.loadUrl("http://www.google.com");   本地文件用:webView.loadUrl("file:///android_asset/XX.html"); 本地文件存放在:assets

  • Android开发笔记之探秘WebView

    概述:            一个显示网页的视图.这个类是你可以滚动自己的Web浏览器或在你的Activity中简单地显示一些在线内容的基础.它使用了WebKit渲染引擎来显示网页,包括向前和向后导航的方法(通过历史记录),放大和缩小,执行文本搜索等. 需要注意的是:为了让你的应用能够使用WebView访问互联网和加载网页,你必须添加Internet的权限在Android Manifest文件中: <uses-permission android:name="android.permiss

  • Android开发笔记之Android中数据的存储方式(一)

    对于开发平台来讲,如果对数据的存储有良好的支持,那么对应用程序的开发将会有很大的促进作用. 总体的来讲,数据存储方式有三种:一个是文件,一个是数据库,另一个则是网络.其中文件和数据库可能用的稍多一些,文件用起来较为方便,程序可以自己定义格式:数据库用起稍烦锁一些,但它有它的优点,比如在海量数据时性能优越,有查询功能,可以加密,可以加锁,可以跨应用,跨平台等等:网络,则用于比较重要的事情,比如科研,勘探,航空等实时采集到的数据需要马上通过网络传输到数据处理中心进行存储并进行处理,有实时性的需求等.

  • Android开发笔记之:AsyncTask的应用详解

    AsyncTask的介绍及基本使用方法关于AsyncTask的介绍和基本使用方法可以参考官方文档和<Android开发笔记之:深入理解多线程AsyncTask>这里就不重复.AsyncTask引发的一个问题上周遇到了一个极其诡异的问题,一个小功能从网络上下载一个图片,然后放到ImageView中,是用AsyncTask来实现的,本身逻辑也很简单,仅是在doInBackground中用HTTP请求把图片的输入流取出,然后用BitmapFactory去解析,然后再把得到的Bitmap放到Image

  • Android开发笔记之Intent初级学习教程

    本文讲述了Android开发笔记之Intent初级学习教程.分享给大家供大家参考,具体如下: 项目创建步骤: New Android Project-> Project name:Intent Build Target:Android 2.2 Application name:IntentDemo Package name:com.b510.intent.activity Create Activity:MainActivity Min SDK Version:8 Finish 1.拨打电话 按

  • Android开发笔记之Android中数据的存储方式(二)

    我们在实际开发中,有的时候需要储存或者备份比较复杂的数据.这些数据的特点是,内容多.结构大,比如短信备份等.我们知道SharedPreferences和Files(文本文件)储存这种数据会非常的没有效率.如果学过JavaWeb的朋友,首先可能想到的是数据库.当然了数据库是一个方案,那么是否还有其他的解决方案呢?今天我们在讲下Android开发笔记之Android中数据的存储方式(一)提到的除了SharedPreferences和Files(文本文件)以外的其他几种数据储存方式:xml文件.SQL

  • Android开发笔记之图片缓存、手势及OOM分析

    把图片缓存.手势及OOM三个主题放在一起,是因为在Android应用开发过程中,这三个问题经常是联系在一起的.首先,预览大图需要支持手势缩放,旋转,平移等操作:其次,图片在本地需要进行缓存,避免频繁访问网络:最后,图片(Bitmap)是Android中占用内存的大户,涉及高清大图等处理时,内存占用非常大,稍不谨慎,系统就会报OOM错误. 庆幸的是,这三个主题在Android开发中属于比较普遍的问题,有很多针对于此的通用的开源解决方案.因此,本文主要说明笔者在开发过程中用到的一些第三方开源库.主要

  • Android开发笔记之:返回键的复写onBackPressed()介绍

    在android开发中,当不满足触发条件就按返回键的时候,就要对此进行检测.尤其是当前Activity需要往前一个Activity传送消息时.即Activity1跳转到Activity3如果采用的是startActivityForResult这种方式,如果不重写返回键,程序不知道要返回给Activity1什么内容就会报错.因此,必须对Activity3的返回按键重写,这里让他传一个"ERROR"信息: 复制代码 代码如下: @Override    public void onBack

  • Android开发笔记之如何正确获取WebView的网页Title

    前言 现在APP中用到H5页面的越来越多,而如何正确获取WebView的网页title是必须要考虑的. 最近做项目的时候,老大让我把之前做的webview打开网页的功能修改一下,说是要动态的获取网页的标题,然后显示在我们自己app的标题栏上,然后我就屁颠屁颠的跑去看webview的源码,看看有没有获取标题这个方法. 网上能查的大部分方法都是在WebChromeClient的onReceivedTitle(WebView view, String title)中拿到title.但是这个方法在网页回

  • Android开发笔记之简单基站定位程序的实现

    经过学习,已经对Android程序的开发流程有了个大体的了解,为了提高我们的学习兴趣,在这一节我们将编写一个简单的基站定位程序.现在LBS(Location Based Service,基于位置的服务)移动应用相当流行(如:微信,切客,嘀咕,街旁等),基站定位是这类程序用到的关键性技术之一,我们来揭开它的神秘面纱吧. 在这一节里,我们会接触到事件.TelephonyManager.HTTP通信.JSON的使用等知识点. 在Android操作系统下,基站定位其实很简单,先说一下实现流程: 调用SD

  • Android开发笔记之:对实践TDD的一些建议说明

    最近部分采用了TDD的方法来开发一个模块,小有收获特此总结一下:1. TDD的基本原则TDD的最核心思想就是先明确需求,且用代码的方式量化,明确需求标准,然后进行编码实现以达成由代码测试来衡量的标准.那么它要求,先把需要标准写出来,每次只写一个.编码实现通过达到,并刚好满足这个标准.这样一点一点的迭代.这样有三个好处:一个是先明确标准,不至于我们迷失主题,偏离方向.有标准在检测,保证代码是正确的.仅满足当前测试,不至于过早优化和过度设计.2. TDD的难点难点在于如何设计这个测试标准,1)让它足

随机推荐