WebView 详解(简易浏览器Demo)

在Android应用中,需要使用WebView控件对Web程序进行解析,这个控件实际上使用了Webkit内核的内嵌浏览器.

下面以一个简易浏览器的例子来讲述WebView的使用步骤:

1 由于涉及到访问网络,所以必须要在AndroidManifest添加访问网络权限:

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

2 然后在布局文件里,添加WebView控件.

因为为了做成一个浏览器的样子,这里除了添加WebView外,还添加了一个EditText用于输入网址,以及一个按钮,用来触发访问网址。除此之外,还添加了四个按钮,分别用来控制“后退”“前进”“主页”“设置成无图模式”等动作。详细代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tab1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:background="#CCCCCC"
        android:orientation="horizontal" >

        <EditText
            android:id="@+id/url"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="5"
            android:inputType="textUri"
            android:text="www.baidu.com" />

        <Button
            android:id="@+id/visit"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="访问" >
        </Button>
    </LinearLayout>

    <ProgressBar
        android:id="@+id/loadding_progress"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="fill_parent"
        android:layout_height="12dp"
        android:max="100" />

    <WebView
        android:id="@+id/wv"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="12" />

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:background="#CCCCCC"
        android:orientation="horizontal" >

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:gravity="center" >
            <ImageButton
                android:id="@+id/back"
                android:layout_width="20dp"
                android:layout_height="20dp"
                android:background="@drawable/backbutton" >
            </ImageButton>
        </LinearLayout>

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:gravity="center" >
            <ImageButton
                android:id="@+id/ahead"
                android:layout_width="20dp"
                android:layout_height="20dp"
                android:background="@drawable/aheadbutton" >
            </ImageButton>
        </LinearLayout>

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:gravity="center" >
            <Button
                android:id="@+id/home"
                android:layout_width="20dp"
                android:layout_height="20dp"
                android:background="@drawable/homebutton" >
            </Button>
        </LinearLayout>

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:gravity="center" >
            <Button
                android:id="@+id/nopicture"
                android:layout_width="20dp"
                android:layout_height="20dp"
                android:background="@drawable/wutubutton" >
            </Button>
        </LinearLayout>
    </LinearLayout>
</LinearLayout>

3 接下来,分开多个模块来讲述WebView的多个功能。

  • 首先,肯定要讲述如何实现加载页面
WebView wv = (WebView) findViewById(R.id.wv);
wv.loadUrl("http://www.baidu.com");
  • 加载页面时,监听加载页面开始,结束等事件

这里通过重写WebViewClient的onPageFinished,onPageStarted方法。来完成想在加载页面开始以及结束时的动作。

class myWebClient extends WebViewClient {
    @Override
    public void onPageFinished(WebView view, String url) {// 加载页面结束时触发
        // TODO Auto-generated method stub
        //可以在这里结束进度条
        super.onPageFinished(view, url);
    }
    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {// 加载页面开始时触发
        // TODO Auto-generated method stub
        //可以在这里启动一个进度条,用来提示用户正在加载
        super.onPageStarted(view, url, favicon);
        }
    }
  • 在上一点虽然可以监听加载页面的开始与结束,但无法知道加载过程中的进度。这里可以通过重写WebChromeClinent的onProgressChanged方法来知道加载过程中的进度。
wv.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int newProgress) {
        Log.i(TAG, "加载进度" + newProgress);
        loadProgressBar.setProgress(newProgress);
        //当进度达到100,则隐藏进度条
        if (newProgress >= 100) {
            loadProgressBar.setAlpha(0);
        }
    }
});
  • 在WebView使用javaScript
webSettings = wv.getSettings();
webSettings.setJavaScriptEnabled(true);//设置可以用javaScript
  • 处理在WebView所点击的链接

    当单击在WebView上的链接时,默认行为是利用默认的网页浏览器打开。

    因此如果要处理在WebView所点击链接,要为您的WebView提供一个WebViewClient,使用setWebViewClient()。

wv.setWebViewClient(new WebViewClient() {
    public boolean shouldOverrideUrlLoading(final WebView view,final String url) {
        wv.loadUrl(url);// 载入网页
        return true;
    }// 重写点击动作,用webview载入
});
  • 访问浏览的历史记录

    可以先通过WebView的canGoBack()方法与canGoForward()方法来判断是否有能返回或者前进的历史记录。

    若有,在通过WebView的goBack()方法与goForward方法来返回或者前进。

case R.id.back:
    if (wv.canGoBack()) {
        wv.goBack();
    }
    break;
case R.id.ahead:
    if (wv.canGoForward()) {
        wv.goForward();
    }
    break;
  • 设置无图模式

通过WebSettings的setBlockNetworkImage()方法便可以实现。

wv.getSettings().setBlockNetworkImage(true);
  • 设置缓存

    在谈设置缓存前,先了解一下有哪些缓存模式:

    LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据

    LOAD_DEFAULT: 根据cache-control决定是否从网络上取数据。

    LOAD_CACHE_NORMAL: API level 17中已经废弃, 从API level 11开始作用同LOAD_DEFAULT模式

    LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.

    LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。

根据上述各种缓存模式的解释,缓存策略应该为,判断是否有网络,有的话,使用LOAD_DEFAULT,无网络时,使用LOAD_CACHE_ELSE_NETWORK。

在设置缓存前,应该给缓存设置一个路径,以及控制缓存大小:

设置缓存路径可以通过WebSettings的setAppCachePath()方法来实现;

而设置缓存大小,可以通过WebSettings的setAppCacheMaxSize()方法来实现。

然后设置缓存,就可以通过WebSettings的setAppCacheEnabled(true)来实现;

关键代码为:

//设置缓存,缓存大小为
webSettings.setAppCacheEnabled(true);
webSettings.setAppCachePath(CachePath.getCachePath());
webSettings.setAppCacheMaxSize(1024*1024*8);
//当有网时,缓存模式设置为LOAD_DEFAULT;当没网时,缓存模式设置为LOAD_CACHE_ELSE_NETWORK;
if (checkNet.isNetWorkConnected()) {
    webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
}else {
    webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        }
时间: 2024-12-15 11:01:43

WebView 详解(简易浏览器Demo)的相关文章

Android开发之WebView详解

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

android WebView详解,常见漏洞详解和安全源码(下)

上篇博客主要分析了 WebView 的详细使用,这篇来分析 WebView 的常见漏洞和使用的坑. 上篇:android WebView详解,常见漏洞详解和安全源码(上) 转载请注明出处:http://blog.csdn.net/self_study/article/details/55046348 对技术感兴趣的同鞋加群 544645972 一起交流. WebView 常见漏洞 WebView 的漏洞也是不少,列举一些常见的漏洞,实时更新,如果有其他的常见漏洞,知会一下我-- WebView

android WebView详解,常见漏洞详解和安全源码

这篇博客主要来介绍 WebView 的相关使用方法,常见的几个漏洞,开发中可能遇到的坑和最后解决相应漏洞的源码,以及针对该源码的解析. 由于博客内容长度,这次将分为上下两篇,上篇详解 WebView 的使用,下篇讲述 WebView 的漏洞和坑,以及修复源码的解析. 下篇:android WebView详解,常见漏洞详解和安全源码(下) 转载请注明出处:http://blog.csdn.net/self_study/article/details/54928371. 对技术感兴趣的同鞋加群 54

window.open()详解及浏览器兼容性问题

一.基本语法:window.open(pageURL,name,parameters)其中:pageURL 为子窗口路径name  为子窗口名字parameters 为窗口参数(各参数用逗号分隔) 二.示例 <script type="text/javascript"> window.open('page.html','newwindow','height=500,width=800,top=0,left=0, toolbar=no,menubar=no,scrollbar

Android WebView 详解

相关API 相关类介绍 WebResourceRequest 添加于API21,封装了一个Web资源的请求信息,包含:请求地址,请求方法,请求头,是否主框架,是否用户点击,是否重定向 WebResourceResponse 封装了一个Web资源的响应信息,包含:响应数据流,编码,MIME类型,API21后添加了响应头,状态码与状态描述 WebResourceError 添加于API23,封装了一个Web资源的错误信息,包含错误码和描述 CookieManager 管理用于WebView的cook

WebView详解

WebView是Android中一个非常实用的组件,它和Safai.Chrome一样都是基于Webkit网页渲染引擎,可以通过加载HTML数据的方式便捷地展现软件的界面.使用WebView开发软件有一下几个优点: 1.可以打开远程URL页面,也可以加载本地HTML数据: 2.可以无缝的在java和javascript之间进行交互操作: 3.高度的定制性,可根据开发者的需要进行多样性定制. 下面就通过例子来介绍一下WebView的使用方法. 我们先建一个webview项目,项目结构如左图: 在这个

Anaroid WebView详解大全

资源描述: 1.android提供了webView控件专门用来浏览网页. 然后在程序中装载webView控件,设置属性,比如:颜色.字体.要访问的网址等.通过loadUrl方法设置当前webView需要访问的网址.在创建WebView时,系统有一个默认的设置,我们可以通过WebView.getSettings来得到这个设置. 2.下面是设置一些常用属性.状态的方法 WebSettings常用方法: setAllowFileAccess 启用或禁止WebView访问文件数据 setBlockNet

BitBlt 函数 详解2 附Demo

该函数对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境. 函数原型 [DllImport("gdi32.dll")] public static extern bool BitBlt(IntPtr hObject, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hObjectSource, int nXSrc, int nYSrc, int dwRop); 参数 hDestDC:指向

iOS10通知及通知拓展Extension使用详解(附Demo)

1.1-iOS10拓展简介 1.2-iOS10通知使用 1.3-iOS10通知拓展Extension使用 1.4-效果演示 如果对开发有兴趣的可以来黑马学习iOS开发:黑马程序员 源代码下载地址:代码下载 1.1-iOS10拓展简介 iOS10系统最大的一个亮点就是增加了系统应用的拓展功能Extension Extension功能可以理解为自定义系统界面 本小节我们就以自定义系统通知界面来学习一下Extension的使用 其他功能的Extension我们不可能逐一讲解,希望大家能够在理解的基础上