WebViewのデータ増大について

2,067 views
Skip to first unread message

大沢

unread,
May 11, 2011, 9:47:17 AM5/11/11
to 日本Androidの会
はじめまして大沢と言います。

下のプログラムでweb画面を表示させており。終了キーで各キャッシュを削除していますが、
いろんな画面を見るうちにアプリケーションの管理を確認すると確かにキャッシュは削除
されていますが、データは肥大しています。このデータを終了時最小化することは可能でしょうか?

ご存じの方よろしくお願いします。

import android.app.Activity;
import android.os.Bundle;
import android.content.Context;
import android.content.Intent;
import android.webkit.*;
import android.webkit.WebStorage.QuotaUpdater;
import android.view.*;
import java.lang.reflect.Field;
import android.provider.Browser;

public class web extends Activity {

  private static final int MENU_ITEM1 = Menu.FIRST;
WebView webView;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

webView = (WebView)findViewById(R.id.main_webview);
webView.setWebChromeClient(new WebChromeClient());
webView.setWebViewClient(new WebViewClient());

WebSettings setting = webView.getSettings();
setting.setJavaScriptEnabled(true);
setting.setGeolocationEnabled(true);
setting.setJavaScriptCanOpenWindowsAutomatically(true);
setting.setLoadsImagesAutomatically(true);
setting.setPluginsEnabled(true);
setting.setLightTouchEnabled(true);
setting.setSupportZoom(true);
setting.setDatabaseEnabled(true);
setting.setDatabasePath("/data/data/" + getPackageName() + "/
database");
setting.setDomStorageEnabled(true);
setting.setAppCacheMaxSize(1024 * 1024 * 8);
setting.setAppCachePath("/data/data/" + getPackageName() + "/
cache");
setting.setAppCacheEnabled(true);
setting.setAllowFileAccess(true);
setting.setCacheMode(WebSettings.LOAD_NORMAL);

WebView webView = (WebView)findViewById(R.id.main_webview);
webView.setWebViewClient(new CustomWebViewClient());
webView.loadUrl("http://google.co.jp");


       @Override
public boolean onCreateOptionsMenu( Menu menu ) {
super.onCreateOptionsMenu( menu );

MenuItem item1 = menu.add(Menu.NONE, MENU_ITEM3, Menu.NONE, "終
了");

// 追加したメニューアイテムのアイコンを設定
item1.setIcon( android.R.drawable.ic_menu_myplaces );
fileMenu.setIcon( android.R.drawable.ic_menu_add );
item3.setIcon( android.R.drawable.ic_lock_power_off );

return true;
}
// オプションメニュー動作
@Override
public boolean onOptionsItemSelected(MenuItem item) {

switch (item.getItemId()) {

// アプリ終了
case MENU_ITEM1:

Context context = getBaseContext();
WebView webview = new WebView(context);


webview.clearFormData();

webview.clearHistory();

              webview.clearCache(true);

CookieManager.getInstance().removeAllCookie();

finish();

return true;
}
return true;
}
}

大垣憲俊

unread,
May 29, 2011, 7:49:28 AM5/29/11
to android-g...@googlegroups.com
大垣です。

同様の質問と回答を見つけました。

その一部を引用します。

context.deleteDatabase("webview.db");
context.deleteDatabase("webviewCache.db");

大沢直樹

unread,
May 29, 2011, 8:29:37 AM5/29/11
to android-g...@googlegroups.com
大垣さん

すいません。お返事を頂く前に私も見つけ、既に入れております。
ここで展開するのを忘れておりました。

今悩んでいるのはwebviewを複数立ち上げ一括終了させる手順。finish()だけでは単体でしか
終了しません。
またgoogleやyahooで現在地を取得し周辺情報を表示させるやり方です。いろんなサイトを見ながらLocationManagerを入れてますが何故かうまくいきません。

何か情報をお持ちでしょうか?

大垣憲俊

unread,
May 29, 2011, 11:10:06 AM5/29/11
to android-g...@googlegroups.com
大沢さん

大垣です。

質問を重ねるのは分かりにくいので、
次回からは別に投稿されるほうがいいですね。


>今悩んでいるのはwebviewを複数立ち上げ一括終了させる手順。
>finish()だけでは単体でしか終了しません。

Intent.FLAG_ACTIVITY_CLEAR_TOP あたりのお話でしょうか。

ダメ男のブログ「Android Tips Activityの挙動」
http://edywrite.blogspot.com/2011/02/android-tips-activity.html


>またgoogleやyahooで現在地を取得し周辺情報を表示させるやり方です。

いくらでもサンプルがありますね。

@IT  Androidで動く携帯Javaアプリ作成入門(16)
「地図/位置情報/GPSを使うAndroidアプリを作るには」


大沢直樹

unread,
May 30, 2011, 11:03:30 AM5/30/11
to android-g...@googlegroups.com
大垣さん

すいません。僕の説明が悪かったですね。
確かにIntent.FLAGで呼び出すと、webviewを終了出来ることは理解しました。
ありがとうございます

ではなくメールで
webviewを呼び出した後、ホームに帰り、再度メールを立ち上げるとwebviewが起動してしまうと言う事なんです。webviewが引っ張っている状態と思われます。

launchModeでsingleTopやsingleTaskは試しました。


大垣憲俊

unread,
May 30, 2011, 8:51:50 PM5/30/11
to android-g...@googlegroups.com
大沢さん

大垣です。 すみません、まだ理解できないので。

>メールでwebviewを呼び出した後、ホームに帰り、
>再度メールを立ち上げるとwebviewが起動してしまうと言う事なんです。

メールというのは、あらかじめ組み込まれているメールアプリのことでしょうか。
webviewが起動した後、HomeではなくBackで戻ればすむのでは。。。

ちなみに、HomeやBackは(キー検出部分を再実装しないかぎり、いまのところ)
アプリで制御できないような気がします。


suppi__

unread,
May 30, 2011, 10:50:00 PM5/30/11
to android-g...@googlegroups.com
携帯からですがsuppi__です。

intentのflagにFLAG_ACTIVITY_NEW_TASKでどうでしょうか。
この場合ホームの後、webviewを起動した時に表示していた画面になりますが、、
動きに問題なければ、NO_HISTRYもありかなと思います。

> ちなみに、HomeやBackは(キー検出部分を再実装しないかぎり、いまのところ)アプリで制御できないような気がします。

homeは無理ですがbackは制御で無効にしたりできますね

2011年5月31日火曜日 大垣憲俊 noritos...@gmail.com:

> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
>

大垣憲俊

unread,
May 31, 2011, 3:26:25 AM5/31/11
to android-g...@googlegroups.com
suppi__さん。フォロー、ありがとうございます。

>> ちなみに、HomeやBackは(キー検出部分を再実装しないかぎり、いまのところ)
>>アプリで制御できないような気がします。
> homeは無理ですがbackは制御で無効にしたりできますね

はい。実装は、こんな感じ。

public class MyController extends FrameLayout {

    //...

    @Override

    public boolean dispatchKeyEvent(KeyEvent event) {

        int keyCode = event.getKeyCode();

        if (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_MENU) {

            //...

            return true;

        } else {

            //...

        }

        return super.dispatchKeyEvent(event);

    }

    //...

}


大垣憲俊

unread,
May 31, 2011, 3:40:05 AM5/31/11
to android-g...@googlegroups.com
大沢さん

大垣です。 再度の確認です。以下のサイトに説明があります。
(副部長、勝手にリンクしてすみません)

Y.A.Mの雑記帳
「Android Activity, Task, Stack, Launch mode」


以下、一部引用します。

「アクティビティをスタックから削除する他の方法

Intent オブジェクトに FLAG_ACTIVITY_CLEAR_TOP フラグが含まれている
 +
そのインテントを処理すべきタイプのアクティビティのインスタンスが
対象タスクのスタック内に存在する
 ↓ 
そのインスタンスがスタックの最上位になってインテントに応答できるよう、
それより上位のアクティビティはすべてクリアされる」

suppi__

unread,
May 31, 2011, 7:04:11 AM5/31/11
to android-g...@googlegroups.com
こんばんは、PCからsuppi__です。

大垣さんこちらこそフォローありがとうございます。

携帯からでは書ききれませんでしたので追記です。
>メールでwebviewを呼び出した後、ホームに帰り、
>再度メールを立ち上げるとwebviewが起動してしまうと言う事なんです。
大沢さんのおっしゃっているこちらですが、メールを起動したのにwebviewが立ち上がるのは
ユーザ的に混乱するよ!ということだと思います(あってます?

大垣さんの引用されたリンク先を見てもらえればわかると思いますが、
何もIntent.flagに指定せずにActivityを起動した場合、同一タスク内のスタックに乗るためです。
そのため、homeボタンでホームに移動した後にアプリを起動するとスタック最上位のwebviewが立ち上がります。

大沢さんの期待している動作としては、homeボタン後にメール起動でwebviewではなくwebviewを起動したメールの画面になる。でいいでしょうか。
その場合はwebview起動時にIntent.flagにNEW_TASKとCLEAR_TOPを付ければ、
同一タスクでなく別タスクとして起動されるために上記の動きになると思います。

蛇足ですが、ホームボタン長押しで表示される最近使用したタスクの一覧を見ると、
flagを付けると別タスクとしてアプリを立ち上げていることがわかります。

11/05/31 大垣憲俊 <noritos...@gmail.com>:

大沢直樹

unread,
May 31, 2011, 10:58:37 AM5/31/11
to android-g...@googlegroups.com
大垣さん
suppi__さん

回答が遅れ、申し訳ありません。
現場が火を噴いており今帰ってきたところです。

大垣さん
>メールというのは、あらかじめ組み込まれているメールアプリのことでしょうか。

はい、その通りです。

言葉足らずでしたので図?で説明させて頂くと

1.webbiewで何かしらの画面を表示

2.ホーム画面に遷移

3.メールアプリを起動させ、ページ内のリンクで
webbiew起動

4.再度ホーム画面に遷移

5.メールアプリを起動させるとwebbiewしている

suppi__さん
>>メールでwebviewを呼び出した後、ホームに帰り、
>>再度メールを立ち上げるとwebviewが起動してしまうと言う事なんです。
>大沢さんのおっしゃっているこちらですが、メールを起動したのにwebviewが立ち
>上がるのはユーザ的に混乱するよ!ということだと思います(あってます?

はい、あっています。その通りです。あらかじめ組み込まれているメールからの起動なのでIntentを組み込めず、どう処理すれば思い通りになるのかと。。。

大沢直樹

unread,
Jun 2, 2011, 11:25:40 AM6/2/11
to android-g...@googlegroups.com
大垣さん

大沢です。コンパイラエラーを解消し、実装してみましたが
駄目でしたね。。。

    private static final String TAG=RabbitBrowser.class.getName();
    private static ArrayList<Activity> activities=new ArrayList<Activity>();

        activities.add(this);

     @Override
     public void onDestroy()
     {
         super.onDestroy();
         activities.remove(this);
     }

     public static void finishAll()
     {
         for(Activity activity:activities)
            activity.finish();
     }
Message has been deleted

大沢直樹

unread,
Jun 3, 2011, 7:22:28 AM6/3/11
to android-g...@googlegroups.com
大垣さん

大沢です。

個人宛にメールさせて頂きましたのでご確認頂けますでしょうか。

大垣憲俊

unread,
Jun 3, 2011, 10:38:03 AM6/3/11
to 日本Androidの会
大沢さん、現象が再現しないようです。

頂いたソースコードそのままで、
エミュレータ(2.1-update1)と、実機(T-01C, 2.2)で試しましたが、

>1.webviewで何かしらの画面を表示
>2.ホーム画面に遷移
>3.メールアプリを起動させ、ページ内のリンクでwebview起動
>4.再度ホーム画面に遷移
>5.メールアプリを起動させるとwebviewしている

この手順の 5. の段階で、メール画面となり、webviewは現れてきません。
なにか手順が違うのでしょうか?

大沢直樹

unread,
Jun 3, 2011, 11:04:56 AM6/3/11
to android-g...@googlegroups.com
大垣様

大沢です。

当機LINX3D(2.1)ですがこちらは発生しています。
詳細にしましたので試して頂けますか。

1.webviewで何かしらの画面を表示
2.ホームキー押下でホーム画面(デスクトップ)に遷移。
3.spメールアプリを起動させ、メールページ内のリンクでwebview起動しリンクのページが表示
4.再度ホームキー押下でホーム画面(デスクトップ)に遷移。
4.1のwebviewを起動させると何かしらの画面が表示された状態
5.ホームキー押下でホーム画面(デスクトップ)に遷移。
6.メールアプリを起動させるとリンクのページが表示



大垣憲俊

unread,
Jun 3, 2011, 11:43:41 AM6/3/11
to 日本Androidの会
大沢さん

大垣です。お手数おかけしました。
再現できました。

> 1.webviewで何かしらの画面を表示
> 2.ホームキー押下でホーム画面(デスクトップ)に遷移。
> 3.spメールアプリを起動させ、メールページ内のリンクでwebview起動しリンクのページが表示
> 4.再度ホームキー押下でホーム画面(デスクトップ)に遷移。
> 4.1のwebviewを起動させると何かしらの画面が表示された状態
> 5.ホームキー押下でホーム画面(デスクトップ)に遷移。
> 6.メールアプリを起動させるとリンクのページが表示

ついでに、あらかじめ組み込まれたブラウザで同じ手順を踏むと、
同じ現象にはなりませんでした。
ということは、ブラウザのソースコードを見れば
解決策が見つかるだろうと思いますので、何か分かったらお知らせします。


大垣憲俊

unread,
Jun 3, 2011, 12:56:38 PM6/3/11
to 日本Androidの会
大沢さん

大垣です。

> ついでに、あらかじめ組み込まれたブラウザで同じ手順を踏むと、
> 同じ現象にはなりませんでした。
> ということは、ブラウザのソースコードを見れば
> 解決策が見つかるだろうと思いますので、何か分かったらお知らせします。

見たところ、あらかじめ組み込まれたブラウザ (Browserと略)との違いは大きいです。
まず、Browserは、AndroidManifest.xml の <activity> に次の2つがあります。

android:launchMode="singleTask"
android:alwaysRetainTaskState="true"

singleTaskなのでタスクを1つのみしか起動できないことと、
alwaysRetainTaskStateがtrueなので、タスクの状態が保持されます。

大沢さんのブラウザでこれを指定すると、メールからリンクをクリックしても、
その前に表示していたブラウザ画面のまま更新されなくなります。

# Browserでは、onNewIntent()をオーバーライドしていますので、
# ソースコードを流用して同じようにしてみてはいかがでしょうか。

BrowserにはGPSデータ取得部分なども含まれていますので、
それで他の問題(データ肥大やGPS連動)も解決できるのでは...。

Browserのgitリポジトリは以下です。
http://android.git.kernel.org/?p=platform/packages/apps/Browser.git;a=tree

大垣憲俊

unread,
Jun 3, 2011, 1:02:40 PM6/3/11
to 日本Androidの会
すみません。大垣です。

> Browserのgitリポジトリは以下です。http://android.git.kernel.org/?p=platform/packages/apps/Browser.git;a...

gitリポジトリのリンク切れです。いつも失敗します。

以下のサイトで platform/packages/apps/Browser.gitを見つけてください。

http://android.git.kernel.org/

kazutaka kamiya

unread,
Apr 5, 2012, 12:19:31 PM4/5/12
to android-g...@googlegroups.com


2011年6月4日0:43 大垣憲俊 <noritos...@gmail.com>:
--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。




--
神谷です、お疲れ様です。
Reply all
Reply to author
Forward
0 new messages