android webview 二次验证流程分析 shouldOverrideUrlLoading深度分析

转自:https://blog.csdn.net/a0407240134/article/details/51482021

一. shouldOverrideUrlLoading的含义 

Sdk中的解释

public boolean shouldOverrideUrlLoading (WebView view, String url)Added in API level 1. 

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".

 

这里面一共蕴含着三层意思:

1.若没有设置 WebViewClient 则由系统(Activity Manager )处理该 url,通常是使用浏览器打开或弹出浏览器选择对话框。

2.若设置 WebViewClient 且该方法返回 true ,则说明由应用的代码处理该 url,WebView 不处理。

3.若设置 WebViewClient 且该方法返回 false,则说明由 WebView 处理该 url,即用 WebView 加载该 url

 

shouldOverrideUrlLoading调用时机是:

第一:浏览器内核内部检测到需要load另一个url,此时就有可能通过调用shouldOverrideUrlLoading来请求host app怎么做。(原因参考后面的"源码分析")。

第二:host app通过webview.loadUrl来load的页面,都不会触发shouldOverrideUrlLoading(原因参考后面的"源码分析")

二.二次验证期间shouldOverrideUrlLoading和onPageFinished调用分析

 

 

只分析到加载完登陆界面,后面的流程和这类似。我们可以看到,shouldOverrideUrlLoading返回true比返回false多调用了一次onPageFinished. 这次onPageFinished是在load fail触发的.在浏览器内核里会区分load complete和load fail, 但是在app层,就只有onPageFinished.

 

下面是Setting中shouldOverrideUrlLoading源码

@Override

public boolean shouldOverrideUrlLoading(WebView view, String url) {

mRedirectCount++;

mRedirectUrl = url;

view.loadUrl(url);

return true;

}

在shouldOverrideUrlLoading中直接使用webview.loadUrl(url),然后return true. 效果和直接return false是一样的,且onPageFinished会少一次调用.

在shouldOverrideUrlLoading中调用webview.loadUrl(url),也没啥意义.因为直接return false后,webview会自动去load该url.

所以修改方法是:去掉view.loadUrl(url)并返回false.

 

 

源码分析:

在AwContents.java中给出了什么时候才调用shouldOverrideUrlLoading (chromium46中)

源码如下:

final boolean isLoadUrl = (transitionType & PageTransition.FROM_API) != 0;

...

if ((!isLoadUrl || isRedirect) && !isBackForward && !isReload

                    && !navigationParams.isPost) {

if (!mContentsClient.hasWebViewClient()) {

ignoreNavigation = AwContentsClient.sendBrowsingIntent(mContext, url,

navigationParams.hasUserGesture

                    || navigationParams.hasUserGestureCarryover,

                    navigationParams.isRedirect);

} else {

ignoreNavigation = mContentsClient.shouldOverrideUrlLoading(url);

}

}

 

从上面可以看出,浏览器如下行为:前进后退(isBackForward ),刷新(isReload),Post请求(navigationParams.isPost)都不会触发shouldOverrideUrlLoading.

 

如果都不是以上行为,还要满足isRedirect或!isLoadUrl 才能触发shouldOverrideUrlLoading.

isRedirect就是重定向的url,即重定向url也会触发shouldOverrideUrlLoading;这里重点介绍以下isLoadUrl.

凡是webview.loadUrl出load页面的,isLoadUrl都是true(原因是webview.loadUrl最终会调到loadUrl(LoadUrlParams params),进而params.setTransitionType(params.getTransitionType() | PageTransition.FROM_API)).

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值