Вопрос по cordova, jquery, android, java – Программно очистить кэш приложения PhoneGap / Cordova на Android, чтобы имитировать новую установку?

4

Это связано с моим предыдущим вопросом о & apos;Как очистить localStorage моего приложения на моем эмуляторе Android при каждой установке?& APOS ;.

Он также основан на & apos;Как очистить кеш приложений Android?& APOS; и & apos;Как программно очистить данные приложения?& APOS ;.

Ни один из приведенных выше вопросов не дает однозначного ответа, применимого к приложениям Android PhoneGap / Cordova.Этот пост в блоге отИгорь Крупин охватывает ситуацию в контекстеnative Приложение для Android, поэтому этот вопрос распространяется и на Cordova.

Я отправлю ответ сам, но я полный нуб Java, поэтому, пожалуйста, отредактируйте, чтобы улучшить.

Ваш Ответ

3   ответа
2

этот блог отИгорь Крупин.

ВашProject > src > [com/org/whatever].[YourNameSpace].[ActivityNameHere] > [ActivityNameHere].java должно выглядеть примерно так для обычного приложения PhoneGap.

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");
    }    
}

Что мы делаем, так это меняем его на следующий код.Unchanged lines are commented out for clarity, but should be uncommented when implemented.

Пожалуйста, не забудьте заменить[com/org/whatever], [YourNameSpace]иmultiple [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, поэтому я взломал это вместе из того, что я смог найти, и это, кажется, работает. Пожалуйста, отредактируйте соответственно - я думаю, что это должно быть доступно людям, чтобы эффективно копировать & amp; вставьте, когда им это нужно, так как весь смысл PhoneGap на Android состоит в том, чтобы абстрагировать разработчика от Java (который, для записи, я начну изучать, как только мой текущий проект будет завершен).

Код, кажется, работает, по крайней мере, в моем случае. Было бы неплохо добавить в -

(1) Возможность вызывать эту функцию из JS, а такжеэти строки.

а также

(2) Выбор очистить кешonly the first time the app is runТаким образом, вы можете смоделировать приложение как «принудительно закрытое».

Большое спасибо, Джаспер. Вы экономите один день ..
Это тоже не работает. Я тестирую в Kitkat и Cordova составляет 3,6
15

если это то, что вы хотите, но это служит моей цели, которая очищает кеш при запуске

https://coderwall.com/p/aj79eg

super.clearCache(); // just add This Line
super.loadUrl("file:///android_asset/www/index.html");
Это не работает
В какой версии Cordova это работает? Убедитесь, что clearCache () не уничтожает все, что вы, возможно, сохранили в локальном хранилище, то, что оно делало в то время (в cordova 2.0)
Это намного лучше, чем принятый ответ, спасибо
Вы можете обновить ссылку? Очень помогло бы.
Вы могли бы использовать оба
5

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 обновлять содержимое самого приложения или перезагружать его.

Я тоже - это то, что я хотел, когда я опубликовал это. Ваш ответ улучшается на мой, хотя, так что примите! :-) Jasper Mogg

Похожие вопросы