webview的页面跳转

来源:互联网 发布:网上找活软件 编辑:程序博客网 时间:2024/05/22 06:50

在现在的安卓开发中,很多应用都内嵌了H5网页,比如淘宝,携程等app。使用混合式开发可以在不更新版本的情况下更新app内容,对企业来说也可以节约开发成本,既可以在安卓中使用,也可以在apple中使用。

WebView中有两个工具类负责管理网页各种行为:WebChromeClient和WebViewClien t,分别通过 setWebChromeClient() 和 setWebViewClient() 来实例化。WebViewClient帮助WebView处理各种通知、请求事件、记录页面加载过程的。 其中就包括URL地址,我们可以通过它来监控到地址的调用过程。

需要用到的方法有:

public boolean shouldOverrideUrlLoading(WebView view, String url) {本方法的目的是判断新网页的打开方式,当一个新的请求地址在页面发起时,由app自行决定是在浏览器打开还是继续在webview中打开系统默认是返回false,即跳转到手机浏览器中,返回true则不触发后续跳转到手机浏览器的操作,同时需要再次调用loadUrl方法,继续在webview上显示由于这个方法可以实时提供由首页发起的地址请求,即参数中的Url,我们可以对地址进行记录和修改等处理    if(url.contentEquals("http://192.168.1.100/caosin/app_flow.php?act=app_flow")){    }else{        view.loadUrl(url);    }    //return super.shouldOverrideUrlLoading(view, url);    return true;}@Override//webview页面加载开始时就会执行此方法,一般用作重定向时的初始化工作public void onPageStarted(WebView view, String url, Bitmap favicon) {通知app页面开始加载,    super.onPageStarted(view, url, favicon);    mWebView.setVisibility(View.GONE);    pb.setVisibility(View.VISIBLE);    tv.setVisibility(View.VISIBLE);}@Overridepublic void onPageFinished(WebView view, String url) {通知app页面加载结束,该方法只能由宿主视图发起,不能保证页面图片也全部加载出来    super.onPageFinished(view, url);    //loading_over.setVisibility(View.GONE);    rg.setVisibility(View.VISIBLE);    mWebView.setVisibility(View.VISIBLE);    tv.setVisibility(View.GONE);    //pb.setVisibility(View.GONE);    setHideAnimation(pb,800);    setShowAnimation(mWebView,600);}

触发加载网页的行为主要有两种方式:

(A)点击页面,触发<link>标签。

(B)调用WebView的loadUrl()方法。

这两种方法都会发出一条地址,区别就在于这条地址是目的地址还是重定向地址。

通过事先在shouldOverrideUrlLoading(),onPageStarted(),onPageFinished()中添加log的输出,观察输出日志来测试上诉方法的执行顺序。

1.在代码中通过loadUrl加载网页,此时的加载方式属于第二种

log如下截图

2.点击上面加载网页的链接,此时的行为是触发link标签,log如下:

 

通过上述范例,我们可以得出以下结论:

在A行为方式(点击页面,触发<link>标签)下:

1、如果是目的地址,那么方法的执行顺序是:

shouldOverrideUrlLoading() -> onPageStarted() -> onPageFinished()

shouldOverrideUrlLoading()由于它要提供给APP选择加载网页环境的机会,所以只要是网页上地址请求,都会获取到。

2、如果是重定向地址,在跳转到目的地址之前会进行不断的地址定位,每一次地址定位都会由以下执行顺序体现出来:

 

onPageStarted()->shouldOverrideUrlLoading()->onPageFinished()

我们暂且设定这种执行顺序叫:fixed position

那么一个正常的重定向地址,方法的执行顺序就是:

 

shouldOverrideUrlLoading()->fixed position -> … -> fixed position ->onPageStarted()->onPageFinished()

在B行为方式(调用WebView的loadUrl()方法)下:

1、 如果是目的地址,那么方法的执行顺序是:

onPageStarted() -> onPageFinished()

loadUrl()加载地址时,一般不会触发shouldOverrideUrlLoading(),一旦触发了,就说明这是一个重定向地址。

2、 如果是重定向地址,方法的执行顺序就是:

fixed position -> … -> fixed position ->onPageStarted()->onPageFinished()

原创粉丝点击