WebView学習小記
4241 ワード
最近、サードパーティの認証を使用し、ユーザー登録を行うプロジェクトがあり、複数のサードパーティプラットフォーム(網易、新浪、テンセントなど)の認証を同時に互換性があることを考慮し、最大のプラットフォーム間(Web端末と携帯電話端末を同時にサポートする)を達成するために、最終的にはWebページ方式を使用してサードパーティの認証を行い、オンラインメンテナンスのアップグレードを容易にすることを確定した.
オンラインシステムである以上、携帯電話側はこのサイトにアクセスすればいい.Androidには強力なWebViewコントロールが用意されており、このツールを利用して、バックグラウンドで開始されたページのジャンプをブロックしたり、ページのJSスクリプト操作に応答したりすることができます.以下に、プロジェクト中に発生した問題の解決記録をいくつか記録します.
1、リダイレクトURLのブロック:
まずクラスandroidについて説明します.webkit.WebViewClient,WebViewClientは、WebViewLoad URL指定ページを管理する周期管理クラスである、以下はそのロードする周期関数であり、androidを継承して再ロードする.webkit.WebViewClientの2つの方法shouldOverrideUrlLoadingとonPageStartedで、指定したリダイレクトURLをブロックできます.
2、応答ページのJS弾窓
WebViewでJSスクリプトに応答するには、以下の設定コードが必要です.
ポップアップ要求に応答しなければなりませんjsコード:Alert.show(「これは弾窓...」);しかし、私たちが応答した弾窓11はどんな形で弾かれたのですか?一番便利なのは、もちろんAlertDialogでjs弾窓の内容を積むことです.OK、あとはjsのリクエストをブロックすることです.
ここにはandroidがあります.webkit.WebChromeClientは、WebViewClient管理ロードURLとは異なり、WebChromeClientは関連リソースを管理するためのものであり、jsはページのリソースの一つである.
WebChromeClientもかなり豊富で健全なコールバックAPIを提供していますが、ここではJS弾窓のニーズに応えるしかありません.具体的には、次の例を参照してください.次のセグメントでWebChromeClientを再ロードする方法は、次のとおりです.
3、ウェブページの後退を実現する
ネットサーフィンに慣れている人は、ページの後退に慣れているに違いないが、webviewではどうやって実現するのだろうか.簡単な歌、間にBackキーを押すと、結局押すと、webviewをマウントしたActivity全体が脱退し、簡単な分析では、戻る動作がwebviewに傍受されず、かえってActivityに通知され、Activityももちろん前のページに戻ります.OK、その考え方は簡単です.webviewはBackキーの動作を自発的に傍受します.
オンラインシステムである以上、携帯電話側はこのサイトにアクセスすればいい.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;
}
});