首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

WebView学习初记

2012-07-15 
WebView学习小记最近有个项目需要用到第三方身份验证,进行用户登录,考虑到同时兼容多个第三方平台(如网易,

WebView学习小记

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

?

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

?

1、重定向URL的拦截:

?

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

?

//begin load url at herepublic void onPageStarted(WebView view, String url, Bitmap favicon) {        if (url.startsWith(BindURL)) {Result result = parseTargetURL(url);handleResult(result);return;}}//redirect when page loading, go herepublic 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 herepublic void onPageFinished(WebView view, String url) {     handler.sendEmptyMessage(App.WebPageLoadOver);}//load page fail, go herepublic 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 windowpublic 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;              }          });
?

?

?

热点排行