在现在的安卓开发中,很多应用都内嵌了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); } @Override public 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()