android webview对shouldOverrideUrlLoading的理解,对于重定向的url

来源:互联网 发布:知金教育靠谱吗 编辑:程序博客网 时间:2024/05/23 21:53
webView.getSettings().setJavaScriptEnabled(true);//支持jswebView.setWebChromeClient(new ChromeClient());//对js交互的对话框、title以及页面加载进度条的管理webView.setWebViewClient(new WebViewClient());//对webview页面加载管理、如url重定向webView.addJavascriptInterface(null, "game");webView.clearCache(true);//支持缓存
class ChromeClient extends WebChromeClient {@Overridepublic void onShowCustomView(View view, CustomViewCallback callback) {super.onShowCustomView(view, callback);Log.e("tag", "on Show Custom View >>>>>webView");}@Overridepublic void onProgressChanged(WebView view, int newProgress) {super.onProgressChanged(view, newProgress);mProgressBar.setProgress(newProgress);if (newProgress == mProgressBar.getMax()) {mProgressBar.setVisibility(View.GONE);} else {mProgressBar.setVisibility(View.VISIBLE);}}}

重写webVIewClinet:

class WebClient extends WebViewClient {@Overridepublic void onLoadResource(WebView view, String url) {super.onLoadResource(view, url);Log.v("tag", "url = " + url);}@Overridepublic void onReceivedError(WebView view, int errorCode,String description, String failingUrl) {Logcat.dLog("errorCode = "+errorCode);super.onReceivedError(view, errorCode, description, failingUrl);}@Overridepublic void onPageStarted(WebView view, String url, Bitmap favicon) {//webview页面加载开始时就会执行此方法、一般用作重定向时的初始化工作super.onPageStarted(view, url, favicon);}/** * url重定向会执行此方法以及点击页面某些链接也会执行此方法 *  * @param view *            当前webview * @param url *            即将重定向的url * @return true:表示当前url已经加载完成,即使url还会重定向都不会再进行加载 false 表示此url默认由系统处理,该重定向还是重定向,直到加载完成 */@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {if (!Tools.urlCheck(url)) {return true;}if (!TextUtils.isEmpty(url) && url.endsWith("apk")) {Intent viewIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));startActivity(viewIntent);} else {if (!WebViewActivity.processCustomUrl(WebActivity.this, url, null, false)) {url = WebViewActivity.addCookie2Url(WebActivity.this, url);// view.loadUrl(url);//(步骤一)// return true;//(步骤二)} else {return true;}}Logcat.dLog("url loading = " + url);return super.shouldOverrideUrlLoading(view, url);//(步骤三)}@Overridepublic void onPageFinished(WebView view, String url) {//if (TextUtils.isEmpty(title)) {title = view.getTitle();if (!TextUtils.isEmpty(title) && title.length() > 8) {title = title.substring(0, 8) + "...";}titleNameTV.setText(title);}super.onPageFinished(view, url);}}

注意:

若步骤一执行则会重新加载webView,并且不执行步骤二,则由于会执行步骤三,导致返回false,则系统也会加载一次,导致执行了两次,当执行webview.goBack()返回上一页时就会一直在当前页打转:注:这个url是重定向的url:解决办法:将步骤一和步骤二去掉(本身就是多余的代码,因为返回false系统会执行加载,没必要在执行webVIew.loadUrl(url))

若是将步骤一和步骤二去掉,由于是系统执行的重定向,默认是绑定为一个整体即一个url,当点击webView,goback(),直接返回上页(不是重定向的页面),因为系统管理的webview堆栈(通过此webView.copyBackForwardList()获得堆栈列表,实际是一个对象(包含堆栈的大小,当前加载),再由此对象下ArrayList管理)只记录重定向最初的url,所以返回的时候回直接返回到上一页



shouldOverrideUrlLoading :这个方法的返回值

      return true 表示当前url即使是重定向url也不会再执行(除了在return true之前使用webview.loadUrl(url)除外,因为这个会重新加载)

      return false  表示由系统执行url,直到不再执行此方法,即加载完重定向的ur(即具体的url,不再有重定向)


注:设置自适应则可能会导致不支持js或css导致界面布局出现错乱

// 自适应屏幕
webSettings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);




1 0
原创粉丝点击