`
zhiweiofli
  • 浏览: 511651 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

WebView学习小记

阅读更多

最近有个项目需要用到第三方身份验证,进行用户登录,考虑到同时兼容多个第三方平台(如网易,新浪,腾讯等)的验证,而且要达到最大可能的跨平台(同时支持网页端和手机端),最终确定采取使用网页方式进行第三方的身份验证,以便于在线维护升级。

 

既然是在线系统,手机端就是访问该网点就是了。Android上提供了强大的WebView控件,利用这一工具,我们可以拦截各种由后台发起的页面跳转,也可以响应页面的JS脚本操作等等。以下是记录了一些,在项目过程中,遇到的问题的解决记录。

 

1、重定向URL的拦截:

 

我们首先了解一下类android.webkit.WebViewClient,WebViewClient是管理WebView加载URL指定页面的周期管理类,下面都是其加载的周期函数,通过继承并重载android.webkit.WebViewClient的两个方法shouldOverrideUrlLoading和onPageStarted,就可以实现拦截指定的重定向URL。

 

//begin load url at here	
public void onPageStarted(WebView view, String url, Bitmap favicon) { 
       
		if (url.startsWith(BindURL)) {
			Result result = parseTargetURL(url);
			handleResult(result);
			return;
		}
	}

//redirect when page loading, go here
public boolean shouldOverrideUrlLoading(WebView view, String url) { 

		if (url.startsWith(BindURL)) {
			Result result = parseTargetURL(url);
			handleResult(result);
			return true;
		}
		return super.shouldOverrideUrlLoading(view, url);
	}
// when load complete , go here
public void onPageFinished(WebView view, String url) {     
		handler.sendEmptyMessage(App.WebPageLoadOver);
	}

//load page fail, go here
public void onReceivedError(WebView view, int errorCode,    
			String description, String failingUrl) {
		handler.sendEmptyMessage(App.WebPageLoadError);
		super.onReceivedError(view, errorCode, description, failingUrl);
	}
 

2、响应页面的JS弹窗

 

要在WebView上响应JS脚本,必须地要有以下的设置代码,

 

WebSettings setting = webview.getSettings();   
setting.setJavaScriptCanOpenWindowsAutomatically(true); 
setting.setJavaScriptEnabled(true);

 

然后得响应其弹窗请求,js代码:Alert.show("这是弹窗..."); 但是我们响应的弹窗十一什么的形式弹出来的?最方便的,当然就是用AlertDialog来装载js弹窗的内容了。ok,剩下要做的,就是拦截js的请求了。

 

这里我们有android.webkit.WebChromeClient,和WebViewClient管理加载URL不同,WebChromeClient是用来管理相关资源的,js也就是页面的资源之一了。

 

WebChromeClient也提供了相当丰富健全的回调API,可是在这里,我只有响应JS弹窗的需求,具体见下面的实例,下面一段时重载WebChromeClient的方法:

 

@Override  //call when javascript request a popup window
public boolean onJsAlert(WebView view, String url, String message,   
					final JsResult result) {
				new AlertDialog.Builder(ThirdPartyAuthActivity.this)
						.setTitle("网页说:")
						.setMessage(message)
						.setPositiveButton(android.R.string.ok,
								new DialogInterface.OnClickListener() {

									public void onClick(DialogInterface dialog,
											int which) {
										dialog.dismiss();
										result.confirm();
                                          //tell js, we handle it's request    
									}
								}).create().show();
				return true;
			}
		});

最后不要忘了把重载的WebChromeClient实例设置到view.setWebChromeClient(new WebChromeClient() {.........});

 

 

3、实现网页后退

 

习惯上网冲浪的人,对网页的后退肯定熟悉得不得了,可是在webview上怎么去实现呢?简单呗,之间按Back键就是了,结果一按,整个装载webview的Activity的退出去了,简单分析,就是返回的动作没有被webview监听到,反而通知到了Activity,那Activity当然也返回上一页了。OK,那思路就简单了,webview主动去监听Back键的动作:

 

webview.setOnKeyListener(new View.OnKeyListener() {  

@Override  
public boolean onKey(View v, int keyCode, KeyEvent event) {  
	                if (event.getAction() == KeyEvent.ACTION_DOWN) {  
	                    if (keyCode == KeyEvent.KEYCODE_BACK && 
                          webview.canGoBack()) {  //表示按返回键时的操作
	                        webview.goBack();   //后退  
	                        return true;    //已处理  
	                    }  
	                }  
	                return false;  
	            }  
	        });
 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics