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

这与我之前的问题“ 我如何在每次安装时在Android模拟器上清除应用程序的localStorage”有关? ”。

它还建立在’ 如何清除Android应用缓存? ‘和’ 如何以编程方式清除应用程序数据? ”。

上述问题均未提供适用于Android PhoneGap / Cordova应用程序的直接答案。 Igor Hrupin撰写的 这篇博 文介绍了原生 Android应用程序环境中的情况,因此这个问题扩展到了Cordova。

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

我无法强制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进行刷新,或强制重新加载。

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

https://coderwall.com/p/aj79eg

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

这个答案借用了Igor Hrupin撰写的 这篇博文中的大量代码。

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

我们所做的是将其更改为以下代码。 为清楚起见,未注明的行被注释掉,但在实现时应该取消注释。

请记住用您自己的值替换[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)选择仅在第一次运行应用程序时清除缓存,以便您可以模拟“强制关闭”的应用程序。