以编程方式清除Android上的PhoneGap / Cordova应用程序缓存以模拟全新安装?

时间:2012-06-22 15:26:25

标签: java android jquery cordova

这与我之前提到的“How can I clear my app's localStorage on my Android emulator each time I install it?”问题有关。

它还建立在“How can I clear the Android app cache?”和“How to programatically clear application data?”的基础上。

上述问题均未提供适用于Android PhoneGap / Cordova应用程序的直接答案。 This blog post Igor Hrupin涵盖了 原生 Android应用环境中的情况,因此这个问题扩展到了Cordova。

我会自己发一个答案,但我是一个完整的Java菜鸟,所以请编辑改进。

3 个答案:

答案 0 :(得分:15)

刚刚看到这一个。它可以用一条线完成。我不确定这是否是您想要的,但它符合我的目的,即在启动时清除缓存

https://coderwall.com/p/aj79eg

super.clearCache(); // just add This Line
super.loadUrl("file:///android_asset/www/index.html");

答案 1 :(得分:5)

我无法强制Android重新加载新版本:

super.loadUrl("file:///android_asset/www/index.html");
在调用之间

,所以我首先借用了你的代码,该代码运行得很好,除了我的应用程序写的所有数据都被删除了。

快速简单的解决方法是更改​​上述文件的网址:

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文件的缓存版本。

我非常想知道如何从app内部强制loadUrl进行刷新,或强制重新加载。

答案 2 :(得分:2)

这个答案借this blog post Igor Hrupinthese lines借了很多代码。

对于普通的PhoneGap应用,您的Project > 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)能够沿着{{3}}从JS调用此函数。

(2)选择仅在第一次运行应用时清除缓存 ,这样您就可以模拟“强制关闭”的应用。