2015年7月10日金曜日

Android開発 WebViewでウェブページを読み込む


最近、趣味でAndroidアプリを作っていて、初心者レベルなのですが、若干知見が溜まってきたので、サンプルコードをブログにしてみます。

ここでは、Androidでウェブページを読み込む方法を紹介します。
いくつか方法があるのですがここではスタンダードなWebViewを利用します。
Activityは、Blank Activityを使います。

AndroidManifest.xml
まず。AndroidManifest.xmlを設定します。以下の設定を入れることによってインターネットへのアクセスを許可します。
<uses-permission android:name="android.permission.INTERNET" />

MainActivity.java
MainActivity.javaでは、onCreateにWebViewのコードを書いていきます。
古いAndroid端末では、WebViewで開いたページのリンクをタップすると、標準ブラウザが立ち上がってしまうのですが。以下のコードで抑制をしています。
mWebView.setWebViewClient(new WebViewClient());
JavaScriptを有効にします。
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
ユーザエージェントを設定します。このコードでは、標準のWebViewのユーザエージェントに追加で独自の文字列を追加しています。
String ua = mWebView.getSettings().getUserAgentString();
ua = ua + " my-android-app";
mWebView.getSettings().setUserAgentString(ua);
キャッシュと履歴をクリアします。
mWebView.clearCache(true);
mWebView.clearHistory();
指定したURLを開きます。
mWebView.loadUrl(top_url);
あとは、アプリがバックグラウンドになった時や、別のActivityが有効になったときのWebViewの処理を入れていきます。
onResume, onPause, onStop, onDestroyの処理です。
もし、この設定を入れないと、たとえばYoutubeなどを再生していて、アプリをバックグラウンドにした時などに音が再生されっぱなしになってしまったりします。必ず入れましょう。
また、WebViewを使っているActivityはできるだけ破棄しておかないと、アプリのクラッシュが発生することがあります。
「問題が発生したため〇〇を終了します」といったエラーメッセージが出て、アプリが強制終了してしまったときには、このあたりを疑ってみると良さそうです。
別のActivityを開くときには、 finish(); でアクティビティスタックを破棄しておくと安心できます。

以下の資料が参考になりました。

図で理解するActivityのスタック
http://techblog.qoncept.jp/?p=102
恵比寿のベンチャーで働くエンジニアのメモ帳|【Android】Intent発行時にActivityスタックをクリアする方法
http://6rats.blog62.fc2.com/blog-entry-107.html
1. アクティビティ - ソフトウェア技術ドキュメントを勝手に翻訳
http://www.techdoctranslator.com/android/guide/activities
Android - Activity のライフサイクル再確認 - Qiita
http://qiita.com/calciolife/items/39b2696a9a03e8591d40
Fragmentのライフサイクルメモ - Androidはワンツーパンチ 三歩進んで二歩下がる
http://sakura-bird1.hatenablog.com/entry/20111207/1323267262

activity_main.xml
activity_main.xmlでは、WebViewのレイアウトを記述します。layout_widthとlayout_heightの設定をmatch_parentとしています。WebViewを最大の幅で表示するという設定です。

dimens.xml
dimens.xmlでは、activity_horizontal_margin, activity_vertical_marginを0dpに設定しています。これでWebViewを余白なしで画面いっぱいに表示することができます。

以下、サンプルコードです。