WebView学習小記


最近、サードパーティの認証を使用し、ユーザー登録を行うプロジェクトがあり、複数のサードパーティプラットフォーム(網易、新浪、テンセントなど)の認証を同時に互換性があることを考慮し、最大のプラットフォーム間(Web端末と携帯電話端末を同時にサポートする)を達成するために、最終的にはWebページ方式を使用してサードパーティの認証を行い、オンラインメンテナンスのアップグレードを容易にすることを確定した.
 
オンラインシステムである以上、携帯電話側はこのサイトにアクセスすればいい.Androidには強力なWebViewコントロールが用意されており、このツールを利用して、バックグラウンドで開始されたページのジャンプをブロックしたり、ページのJSスクリプト操作に応答したりすることができます.以下に、プロジェクト中に発生した問題の解決記録をいくつか記録します.
 
1、リダイレクトURLのブロック:
 
まずクラスandroidについて説明します.webkit.WebViewClient,WebViewClientは、WebViewLoad URL指定ページを管理する周期管理クラスである、以下はそのロードする周期関数であり、androidを継承して再ロードする.webkit.WebViewClientの2つの方法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(「これは弾窓...」);しかし、私たちが応答した弾窓11はどんな形で弾かれたのですか?一番便利なのは、もちろん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;  
	            }  
	        });