4

これは、「インストールするたびに Android エミュレーターでアプリの localStorage をクリアするにはどうすればよいですか?」という以前の質問に関連しています。'。

また、「Android アプリのキャッシュをクリアするにはどうすればよいですか? 」にも基づいています。' および 'アプリケーション データをプログラムでクリアする方法は? '。

上記の質問のどれも、Android PhoneGap/Cordova アプリケーションに適用できる簡単な答えを提供していません。Igor Hrupinによるこのブログ投稿は、ネイティブAndroid アプリのコンテキストでの状況をカバーしているため、この質問はそれを Cordova をカバーするように拡張します。

私は自分で回答を投稿しますが、私は Java 初心者なので、編集して改善してください。

4

3 に答える 3

15

ちょうどこれを見た。1行でできます。これがあなたが望むものかどうかはわかりませんが、起動時にキャッシュをクリアするという私の目的には役立ちます

https://coderwall.com/p/aj79eg

super.clearCache(); // just add This Line
super.loadUrl("file:///android_asset/www/index.html");
于 2012-12-24T11:16:09.777 に答える
5

私はAndroidに新しいバージョンのリロードを強制することができませんでした:

super.loadUrl("file:///android_asset/www/index.html");

呼び出しの合間に、アプリケーションが書き込んでいたすべてのデータも削除されたことを除けば、最初に十分に機能するコードを借用しました。

すばやく簡単な修正は、上記のファイルのURLを変更することです。

super.loadUrl("file:///android_asset/www/index.html?1");

そして、?の後ろの数字を変更します 負荷ごとに。最終的に私は追加しました:

import java.util.Random;

public class MainActivity extends DroidGap {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        Random generator = new Random();
        int r = generator.nextInt();
        super.onCreate(savedInstanceState);
        super.loadUrl("file:///android_asset/www/index.html?" + r);
    }
}

これで、アプリを再構築するたびに、キャッシュされたバージョンのhtmlファイルが実際に更新されます。

アプリ自体からloadUrlを強制的に更新する方法、または再読み込み時に強制的に更新する方法を知りたいです。

于 2012-08-03T14:21:52.847 に答える
2

この回答は、 Igor Hrupinによるこのブログ投稿から多くのコードを借用しています。

通常のPhoneGapProject > src > [com/org/whatever].[YourNameSpace].[ActivityNameHere] > [ActivityNameHere].javaアプリでは、おおよそ次のようになります。

package [com/org/whatever].[YourNameSpace].[ActivityNameHere];

import org.apache.cordova.*;
import android.os.Bundle;

public class [ActivityNameHere] extends DroidGap {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.loadUrl("file:///android_asset/www/index.html");
    }    
}

これを次のコードのように変更します。明確にするために変更されていない行はコメントアウトされていますが、実装時にはコメントを解除する必要があります。

[com/org/whatever][YourNameSpace]、および複数の [ActivityNameHere]プレースホルダーを独自の値に置き換えることを忘れないでください。

// package [com/org/whatever].[YourNameSpace].[ActivityNameHere];

// import org.apache.cordova.DroidGap;
// import android.os.Bundle;

   import java.io.File;
   import android.util.Log;

// public class [ActivityNameHere] extends DroidGap {

       private static [ActivityNameHere] instance;

    // @Override
    // public void onCreate(Bundle savedInstanceState) {

           instance = this;
           [ActivityNameHere].getInstance().clearApplicationData();

    // super.onCreate(savedInstanceState);
    // super.loadUrl("file:///android_asset/www/index.html");
    // }

   public static [ActivityNameHere] getInstance() {
       return instance;
   }

   public void clearApplicationData() {
       File cache = getCacheDir();
       File appDir = new File(cache.getParent());
       if (appDir.exists()) {
           String[] children = appDir.list();
           for (String s : children) {
               if (!s.equals("lib")) {
                   deleteDir(new File(appDir, s));
                   Log.i("TAG", "**************** File /data/data/APP_PACKAGE/" + s + " DELETED *******************");
           }
       }
       }
   }

   public static boolean deleteDir(File dir) {
       if (dir != null && dir.isDirectory()) {
           String[] children = dir.list();
           for (int i = 0; i < children.length; i++) {
               boolean success = deleteDir(new File(dir, children[i]));
               if (!success) {
                   return false;
           }
       }
       }
           return dir.delete();
   }

// }

私の質問で述べたように、私は Java のスキルを持っていないので、見つけたものからこれをまとめてハッキングしましたが、うまくいくようです。それに応じて編集してください - Android での PhoneGap の全体的なポイントは Java から開発者を抽象化することであるため、これは人々が必要なときに効果的にコピー & ペーストできるようにする必要があると思います (記録のために、私は取得します現在のプロジェクトが終了したら、学習に移行します)。

少なくとも私の場合、コードは機能しているようです。追加するといいですね-

(1)これらの線に沿って、JS からこの関数を呼び出す機能。

(2)アプリの初回実行時にのみキャッシュをクリアするという選択。これにより、「強制終了」されているアプリをシミュレートできます。

于 2012-06-22T15:26:25.963 に答える