最近、趣味で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を余白なしで画面いっぱいに表示することができます。
以下、サンプルコードです。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" | |
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" | |
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" | |
android:paddingRight="@dimen/activity_horizontal_margin" | |
android:paddingTop="@dimen/activity_vertical_margin" | |
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> | |
<WebView | |
xmlns:android="http://schemas.android.com/apk/res/android" | |
android:id="@+id/webView" | |
android:layout_width="match_parent" | |
android:layout_height="match_parent" /> | |
</RelativeLayout> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="utf-8"?> | |
<manifest xmlns:android="http://schemas.android.com/apk/res/android" | |
package="com.example.yako.samplewebview" > | |
<uses-permission android:name="android.permission.INTERNET" /> | |
<application | |
android:allowBackup="true" | |
android:icon="@mipmap/ic_launcher" | |
android:label="@string/app_name" | |
android:theme="@style/AppTheme" > | |
<activity | |
android:name=".MainActivity" | |
android:label="@string/app_name" > | |
<intent-filter> | |
<action android:name="android.intent.action.MAIN" /> | |
<category android:name="android.intent.category.LAUNCHER" /> | |
</intent-filter> | |
</activity> | |
</application> | |
</manifest> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<resources> | |
<!-- Default screen margins, per the Android Design guidelines. --> | |
<dimen name="activity_horizontal_margin">0dp</dimen> | |
<dimen name="activity_vertical_margin">0dp</dimen> | |
</resources> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.example.yako.samplewebview; | |
import android.support.v7.app.ActionBarActivity; | |
import android.os.Bundle; | |
import android.view.Menu; | |
import android.view.MenuItem; | |
import android.webkit.WebSettings; | |
import android.webkit.WebView; | |
import android.webkit.WebViewClient; | |
public class MainActivity extends ActionBarActivity { | |
// mWebViewをprivateに | |
private WebView mWebView; | |
// WebViewで開くURLを設定 | |
private static String top_url = "http://takeshiyako.blogspot.jp/"; | |
@Override | |
protected void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.activity_main); | |
// レイアウトのリソースを利用 | |
mWebView = (WebView) findViewById(R.id.webView); | |
// WebViewClientを利用 標準のブラウザの起動を防ぐ | |
mWebView.setWebViewClient(new WebViewClient()); | |
// JavaScriptを有効 | |
WebSettings webSettings = mWebView.getSettings(); | |
webSettings.setJavaScriptEnabled(true); | |
// ユーザエージェント設定 | |
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の「onResume」に基づき開始される | |
*/ | |
@Override | |
public void onResume() { | |
super.onResume(); | |
mWebView.onResume(); | |
} | |
/*** | |
* Activityが「onPause」になった場合や、Fragmentが変更更新されて操作を受け付けなくなった場合に呼び出される | |
*/ | |
@Override | |
public void onPause() { | |
super.onPause(); | |
mWebView.onPause(); | |
} | |
/*** | |
* フォアグラウンドでなくなった場合に呼び出される | |
*/ | |
@Override | |
public void onStop() { | |
super.onStop(); | |
mWebView.onPause(); | |
} | |
/*** | |
* Activityが破棄される時、最後に呼び出される | |
*/ | |
@Override | |
public void onDestroy() { | |
super.onDestroy(); | |
mWebView.destroy(); | |
} | |
@Override | |
public boolean onCreateOptionsMenu(Menu menu) { | |
// Inflate the menu; this adds items to the action bar if it is present. | |
getMenuInflater().inflate(R.menu.menu_main, menu); | |
return true; | |
} | |
@Override | |
public boolean onOptionsItemSelected(MenuItem item) { | |
// Handle action bar item clicks here. The action bar will | |
// automatically handle clicks on the Home/Up button, so long | |
// as you specify a parent activity in AndroidManifest.xml. | |
int id = item.getItemId(); | |
//noinspection SimplifiableIfStatement | |
if (id == R.id.action_settings) { | |
return true; | |
} | |
return super.onOptionsItemSelected(item); | |
} | |
} |