浅谈WebView在新窗口浏览网页(setSupportMultipleWindows()与onCreateWindow()关系)

一,写在前面

我们平常使用电脑浏览器浏览网页可能会有三种方式:

1.新窗口

2.当前窗口种的新选项卡

3.当前选项卡或者窗口

我们知道在电脑系统中同一时间可以开启多个相同的进程,就像你可以同时登陆2个qq一样,而在手机中,同一进程只能有一个在运行。

对比智能手机的浏览器如:QQ浏览器,百度浏览器,电脑浏览器中的新窗口相当于重新开启了一个浏览器,而在手机中,我们是使用WebView加载网页,虽然浏览器其应用进程只有一个,

但是内存中WebView对象可以有多个。在手机上的新窗口就是另外创建一个WebView来加载新的网页。这种关系使得在手机上浏览网页有两种:

1.新选项卡

2.当前选项卡

上面简单了解了他们的关系,下面切入正题

二,setSupportMultipleWindows与onCreatWindow

1.setSupportMultipleWindows

我们在使用WebView时会首先对其进行初始化

WebSettings webSettings = webView.getSettings();
settings.setDefaultFontSize(16);
settings.setDefaultFixedFontSize(13);
settings.setSupportMultipleWindows(true)
...等等

再看HTML <a> 标签的 target 属性:

<a href="http://www.baidu.com" target="_blank">百度一下</a>

tartget有4个属性:

_blank

浏览器总在一个新打开、未命名的窗口中载入目标文档。

_self

这个目标的值对所有没有指定目标的 <a> 标签是默认目标,它使得目标文档载入并显示在相同的框架或者窗口中作为源文档。这个目标是多余且不必要的,除非和文档标题 <base> 标签中的 target 属性一起使用。

_parent

这个目标使得文档载入父窗口或者包含来超链接引用的框架的框架集。如果这个引用是在窗口或者在顶级框架中,那么它与目标 _self 等效。

_top

这个目标使得文档载入包含这个超链接的窗口,用 _top 目标将会清除所有被包含的框架并将文档载入整个浏览器窗口。

我们只需要知道_blank属性即可

setSupportMultipleWindows这个方法是什么意思呢?

setSupportMultipleWindows默认的是false,也就是说WebView默人不支持新窗口,但是这个不是说WebView不能打开多个页面了,只是你点击页面上的连接,当它的target属性是_blank时。它会在当前你所看到的页面继续加载那个连接。而不是重新打开一个窗口。

当你设置为true时,就代表你想要你的WebView支持多窗口,但是一旦设置为true,必须要重写WebChromeClient的onCreateWindow方法。

下面看看这个方法的签名:

   @Override
        public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {

        }

仔细阅读文档,大家应该知道这个参数的意思:

view :请求新窗口的WebView

isDialog : 如果是true,代表这个新窗口只是个对话框,如果是false,则是一个整体的大小的窗口

isUserGesture 如果是true,代表这个请求是用户触发的,例如点击一个页面上的一个连接

resultMsg ,当一个新的WebView被创建时这个只被传递给他,resultMsg.obj是一个WebViewTransport的对象,它被用来传送给新创建的WebView,使用方法:

WebView.WebViewTransport.setWebView(WebView)

返回值:这个方法如果返回true,代表这个主机应用会创建一个新的窗口,否则应该返回fasle。如果你返回了false,但是依然发送resulMsg会导致一个未知的结果。

如果我们仅仅是将WebView嵌入我们自己的应用然后加载网页,很少有必要去设置支持多窗口。只在当前窗口加载新的网页就可。

下面是重写onCreateWindow的必要代码:

WebView.WebViewTransport transport = (WebView.WebViewTransport) msg.obj;
transport.setWebView(webview);    //此webview可以是一般新创建的
msg.sendToTarget();
时间: 2025-01-16 13:29:12

浅谈WebView在新窗口浏览网页(setSupportMultipleWindows()与onCreateWindow()关系)的相关文章

转 Android开发学习笔记:浅谈WebView

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://liangruijun.blog.51cto.com/3061169/647456 WebView(网络视图)能加载显示网页,可以将其视为一个浏览器.它使用了WebKit渲染引擎加载显示网页,实现WebView有以下两种不同的方法: 第一种方法的步骤: 1.在要Activity中实例化WebView组件:WebView webView = new WebView(this); 2

浅谈测试rhel7新功能时的感受及遇到的问题

半夜起来看世界杯,没啥激情,但是又怕错误意大利和英格兰的比赛,就看了rhel7 相关新功能的介绍. 安装还算顺利,安装的界面比以前简洁的多,很清爽,分类很是明确. 有些奇怪的是,我安装的时候,怕有些基础的包没有装上去,所以选定了mini和Web的类型,结果还是有些基础的包没有安装,比如 ifconfig . 虚拟机的网卡,被识别为ens,有意思. yum groupinstall Base 这样的话,就可以把一些基础的包打上.可以正常的时候ifconfig lsof  . 这里需要说明的是,re

javascript如何在新窗口打开网页

javascript如何在新窗口打开网页:有时候需要在新的窗口打开网页,方法有很多,当然这个问题也很简单,主要是针对初学者的.下面介绍两种在新窗口打开网页的方法:1.最基本的方式: <a href="http://www.softwhy.com" target="_blank">蚂蚁部落</a> 只要将链接的target属性值设置为_blank即可.2.使用javascript打开: window.open([url=http://www.s

JS控制新窗口打开网页,防止蜘蛛爬行

<a href="javascript:void(0)" onclick="locationUrl()">点击</a>  这里也可以是图片 <script> function locationUrl(){ var u1 = 'http://www.'; var u2 = 'baidu.com/hl/'; var u3 = 'bak_header.php'; var url = u1+u2+u3; window.open(url);

Response.Redirect在新窗口打开网页

Response.Redirect在新窗口打开网页 Respose.Write("<script language='javascript'>window.open('"+ url +"');</script>"); (打开简洁窗口): Respose.Write("<script language='javascript'>window.open('" + url + "','','resizabl

浅谈测试rhel7新功能时的感受及遇到的问题【转载】

半夜起来看世界杯,没啥激情,但是又怕错误意大利和英格兰的比赛,就看了rhel7 相关新功能的介绍. rhel7的下载地址: https://access.redhat.com/site/downloads/ 安装还算顺利,安装的界面比以前简洁的多,很清爽,分类很是明确. 有些奇怪的是,我安装的时候,怕有些基础的包没有装上去,所以选定了mini和Web的类型,结果还是有些基础的包没有安装,比如 ifconfig . 虚拟机的网卡,被识别为ens,有意思. yum groupinstall Base

浅谈WebView的使用 js alert

http://blog.csdn.net/liuhe688/article/details/6549263 WebView是Android中一个非常实用的组件,它和Safai.Chrome一样都是基于Webkit网页渲染引擎,可以通过加载HTML数据的方式便捷地展现软件的界面.使用WebView开发软件有一下几个优点: 1.可以打开远程URL页面,也可以加载本地HTML数据: 2.可以无缝的在java和javascript之间进行交互操作: 3.高度的定制性,可根据开发者的需要进行多样性定制.

浅谈webview与js交互

浅谈下webview与js的交互,项目中因为需要获取页面中的许多属性,所以用到了这些,让后端在方法中传了过来. 下面的demo是本地的html代码,具体可以仿写,都差不多,注重思想. 1:项目目录 2:jump的代码 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GBK"/> <script type="text/

android浅谈WebView的使用

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