在安卓上编程清除PhoneGap/Cordova应用程序缓存以模拟全新安装?

4
这与我之前的问题 '如何在每次安装Android模拟器上的应用程序时清除其localStorage?' 有关。
它还基于 '如何清除Android应用程序缓存?' 和 '如何以编程方式清除应用程序数据?'。
以上问题都没有给出适用于Android PhoneGap/Cordova应用程序的简单直接答案。这篇博客文章Igor Hrupin撰写,涵盖了本地Android应用程序的情况,因此本问题将其扩展到Cordova。
我将发布自己的答案,但我完全不懂Java,请编辑以改进。
3个回答

15

刚看到这个。它可以用一行代码实现。我不确定这是否是你想要的,但它适合我的目的,即在启动时清除缓存。

https://coderwall.com/p/aj79eg

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

这适用于哪个版本的cordova?请确保clearCache()不会清除您在localstorage中存储的任何内容,因为它曾经在cordova 2.0中这样做。 - Jeroenv3

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

2
这个答案从这篇博客文章中借用了很多代码,该博客文章的作者是Igor Hrupin
对于一个普通的PhoneGap应用程序,您的项目 > 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技能,因此我从我能找到的东西中拼凑出了这个代码,并且它似乎可以工作。请据此进行编辑 - 我认为这是应该让人们有效地复制和粘贴的东西,因为PhoneGap在Android上的全部意义就是将开发者从Java中抽象出来(值得一提的是,在我当前的项目完成后,我将开始学习Java)。
代码似乎可以工作,至少在我的情况下是这样。可以添加以下内容:
(1) 可以按这些线路从JS调用此函数的能力。

(2) 选择只在应用程序首次运行时清除缓存,以便模拟应用程序被“强制关闭”的情况。

这也不起作用。我正在Kitkat中进行测试,cordova是3.6。 - Binod Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接