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

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

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

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

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

Ответы на вопрос(3)

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

Ваш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Таким образом, вы можете смоделировать приложение как «принудительно закрытое».

 16 янв. 2013 г., 08:22
Большое спасибо, Джаспер. Вы экономите один день ..
 05 нояб. 2014 г., 11:09
Это тоже не работает. Я тестирую в Kitkat и Cordova составляет 3,6

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

https://coderwall.com/p/aj79eg

super.clearCache(); // just add This Line
super.loadUrl("file:///android_asset/www/index.html");
 10 авг. 2015 г., 00:58
Вы можете обновить ссылку? Очень помогло бы.
 23 нояб. 2013 г., 00:11
Вы могли бы использовать оба
 13 мая 2014 г., 17:11
В какой версии Cordova это работает? Убедитесь, что clearCache () не уничтожает все, что вы, возможно, сохранили в локальном хранилище, то, что оно делало в то время (в cordova 2.0)
 27 сент. 2013 г., 11:24
Это намного лучше, чем принятый ответ, спасибо
 05 нояб. 2014 г., 11:05
Это не работает
Решение Вопроса

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 Mogg13 янв. 2013 г., 23:32
Я тоже - это то, что я хотел, когда я опубликовал это. Ваш ответ улучшается на мой, хотя, так что примите! :-)

Ваш ответ на вопрос