在Android系统中使用WebViewClient处理跳转URL的方法_java

前言
最近代码里和WebView有很多的交互,webview是android中的浏览器控件,这里主要介绍一下webview如何重载WebViewClient类来控制URL加载。

使用WebViewClient
使用WebViewClinet主要是继承WebViewClient父类,根据需要重写其中的方法,并在WebView中进行配置,示例代码如下:

   

 webView = (WebView) findViewById(R.id.webview);
  webView.setWebViewClient(new ExampleWebViewClient());
  private class ExampleWebViewClient extends WebViewClient {
    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
      handler.proceed();
    } 

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
      view.loadUrl(url);
      return true;
    } 

    @Override
    public void onPageFinished(WebView view, String url) {
      super.onPageFinished(view, url);
    } 

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
      super.onPageStarted(view, url, favicon);
    } 

    @Override
    public void onLoadResource(WebView view, String url) {
      super.onLoadResource(view, url);
    }
  }


WebViewClient方法
1. shouldOverrideUrlLoading(WebView view, String url)

    官方注释:Give the host application a chance to take over the control when a new url is about to be loaded in the current WebView. If WebViewClient is not provided,by default WebView will ask Activity Manager to choose the proper handler for the url. If WebViewClient is provided, return true means the host application handles the url, while return false means the current WebView handles the url. This method is not called for requests using the POST "method". 

翻译:当一个新的url要在当前WebView进行加载的时候,这个方法给应用一个机会来控制url的处理。如果WebView没有setWebViewClient,则默认操作是WebView将询问Activity Manager获取合适的handler处理url。如果WebView设置了setWebViewClient,返回true代表当前应用来处理url,返回false则代表当前webview来处理url。如果http请求是POST方法,该方法将不会被调用。
代码示例:

 

  /**
   * 所有以www.example.com开头的url调用系统浏览器打开 其他的url在当前webview打开
   */
  @Override
  public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (url.indexOf("http://www.example.com") != -1) {
      // 调用系统默认浏览器处理url
      view.stopLoading();
      view.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
      return true;
    }
    return false;
  }

2. shouleOverrideKeyEvent(WebView view, KeyEvent event)

    官方注释:Give the host application a chance to handle the key event synchronously. e.g. menu shortcut key events need to be filtered this way. If return true, WebView will not handle the key event. If return false, WebView will always handle the key event, so none of the super in the view chain will see the key event. The default behavior returns false. 

翻译:给当前应用一个机会来异步处理按键事件。返回true,WebView将不会处理该按键事件,返回false,WebView将处理该按键事件。默认返回是false。
3. onPageStarted(WebView view, String url, Bitmap favicon)和onPageFinished(WebView view, String url)

    官方注释:Notify the host application that a page has started loading. This method is called once for each main frame load so a page with iframes or framesets will call onPageStarted one time for the main frame. This also means that onPageStarted will not be called when the contents of an embedded frame changes, i.e. clicking a link whose target is an iframe. 

翻译:当页面开始加载时被调用。但是,当页面被嵌套时(例如iframe里有一个链接跳转),该方法将不会被调用。(今天就遇到了这种情况,可以通过重载onLoadResource来控制url跳转)

    官方注释:Notify the host application that a page has finished loading. This method is called only for main frame. When onPageFinished() is called, the rendering picture may not be updated yet. To get the notification for the new Picture, use onNewPicture(WebView, Picture). 

翻译:在页面加载结束时被调用。
代码示例:

    // 获取页面加载时间  
   

 private long startTime;
  private long endTime;
  private long spendTime; 

  @Override
  public void onPageFinished(WebView view, String url) {
    endTime = System.currentTimeMillis();
    spendTime = endTime - startTime;
    Toast.makeText(view.getContext(), "spend time is:" + spendTime, Toast.LENGTH_SHORT).show();
  } 

  @Override
  public void onPageStarted(WebView view, String url, Bitmap favicon) {
    startTime = System.currentTimeMillis();
  }

4. onLoadResource(WebView view, String url)

    官方注释:Notify the host application that the WebView will load the resource specified by the given url. 

翻译:通知应用程序WebView将要加载指定url的资源,每一个资源(例如图片,嵌套url,js,css文件)。(可以通过该方法处理iframe嵌套的url)
代码示例:

  @Override
  public void onLoadResource(WebView view, String url) {
    if (url.indexOf("http://www.example.com") != -1 && view != null) {
      view.stopLoading();
      view.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
    }
  } 

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
url
webview 拦截url跳转、webview跳转url、webview 获取跳转url、webviewclient、setwebviewclient作用,以便于您获取更多的相关知识。

时间: 2024-12-21 20:46:14

在Android系统中使用WebViewClient处理跳转URL的方法_java的相关文章

在Android系统中使用gzip进行数据传递实例代码_Android

接下来让我解说一下如何在Android系统中使用gzip进行数据传递 HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术.大流量的WEB站点常常使用GZIP压缩技术来减少文件大小减少文件大小有两个明显的好处一是可以减少存储空间二是通过网络传输文件时可以减少传输的时间.作者在写这篇博客时经过测试4.4MB的文本数据经过Gzip传输到客户端之后变为392KB压缩效率极高. 一.服务端 服务端有2种方式去压缩一种可以自己压缩但是更推荐第二种方式用PrintWriter作为输出流工具类代

opengl-OpenGL 在Android系统中的显示问题

问题描述 OpenGL 在Android系统中的显示问题 openGL在android系统中只能全屏显示吗?可以控制让它只在屏幕的某一个部分显示吗

Android 系统中 Location Service 的实现与架构

前言 定位服务是移动设备上最常用的功能之一,下文以 Android 源码为基础,详细分析了 Android 系统中定 位服务的架构和实现.定位服务是 Android 系统提供的一项系统服务,在 Android 系统中,所有系统服务 的架构都是类似的.只要明白其中一个,然后再去理解其他是很容易的.对于 Android 的应用开发人员来说 ,本文可以帮助他们了解他们所使用的 API 背后的实现.对于 Android 的系统开发人员来说,本文可以帮 助他们更好的了解 Android 系统架构.关于如何

如何在android系统中实现pkcs11,或者有什么可用的开源类库?

问题描述 如何在android系统中实现pkcs11,或者有什么可用的开源类库? 如何在android系统中实现pkcs11,或者有什么可用的开源类库? 解决方案 无法实现 Sun==Oracle => copying bad :)而且更严重的是,在android中没法用,以为没有能够支持的标准PKCS#11(尽管JB确实用一个专用的PKCS#11提供一些东西).并不确定是否代码是在OpenJDK,但是如果是的话,你可以试着移植.但是那基本是不可能的.因为你需要完整的PKCS#11 API,对于

在android系统中如何播放、暂停、停止歌曲?

问题描述 在android系统中如何播放.暂停.停止歌曲? 我在程序中设置了播放.暂停.停止三个按钮.当我点击播放按钮,这个按钮就消失了,显示的是暂停按钮.反之亦然.当我点击播放按钮时,程序不出错.再点击暂停按钮时,就会出错.贴出代码: package com.mpIlango; import java.io.IOException; import java.util.ArrayList; import android.app.Activity; import android.media.Med

Android系统中设置TextView的行间距(非行高)

Android系统中TextView默认显示中文时会比较紧凑,不是很美观.为了让每行保持一定的行间距,可以设置属性android:lineSpacingExtra或android:lineSpacingMultiplier. 关于Android下TextView中文换行问题,可查看Android自定义view-文本自动换行. 1.android:lineSpacingExtra 设置行间距,如"3dp". 2.android:lineSpacingMultiplier 设置行间距的倍数

在android系统中如何监控可写入的控件获得焦点这样的事件

问题描述 在android系统中如何监控可写入的控件获得焦点这样的事件 在写一个手机监控程序的时候发现,需要监控用户的可输入状态.不知道有没有大神能帮忙提供些思路.这是个自主的监控程序,将会在android模拟器中运行,用作与主机进行通信.不是在真正在手机中运行的木马. 初始想法是枚举所有的窗口,然后找出哪一个窗口获得焦点,并判断此窗口是否有edit属性,嗯,PC上应该就是这样做到吧,键盘勾子是不行的,原因是不知道当前是否可输入状态.只不过在android中实在不知道该怎么做,另外,枚举的缺陷是

ios-iOS和Android系统中的微信分身版软件是如何实现的?

问题描述 iOS和Android系统中的微信分身版软件是如何实现的? 如题,微信同时只能启动一个实例,而分身版微信可以同时启动很多个实例,我想知道这是怎么做到的,其中原理是什么? 解决方案 觉得应该是从ART vm下手.猜测,是不是在精简一个小型vm来启动另一个APk. 解决方案二: Android平台上主要借助了系统的多账户机制,相当于在手机中建立了一个"虚拟机",就像是手机中的"第二系统",在其中运行的应用不会对原手机系统产生任何干扰,保障了两个账户的同时独立运

Android系统中的进程管理:进程的创建

对于操作系统来说,进程管理是其最重要的职责之一. 考虑到这部分的内容较多,因此会拆分成几篇文章来讲解. 本文是进程管理系统文章的第一篇,会讲解Android系统中的进程创建. 本文适合Android平台的应用程序开发者,也适合对于Android系统内部实现感兴趣的读者. 概述 Android系统以Linux内核为基础,所以对于进程的管理自然离不开Linux本身提供的机制.例如: 通过fork来创建进行 通过信号量来管理进程 通过proc文件系统来查询和调整进程状态等 对于Android来说,进程