4

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

它还基于“如何清除 Android 应用缓存?' 和 '如何以编程方式清除应用程序数据?'。

上述问题都没有给出适用于 Android PhoneGap/Cordova 应用程序的直接答案。Igor Hrupin的这篇博客文章涵盖了原生Android 应用程序上下文中的情况,因此这个问题将其扩展到了 Cordova。

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

4

3 回答 3

15

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

https://coderwall.com/p/aj79eg

super.clearCache(); // just add This Line
super.loadUrl("file:///android_asset/www/index.html");
于 2012-12-24T11:16:09.777 回答
5

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

于 2012-08-03T14:21:52.847 回答
2

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

对于普通的 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) 从 JS 调用这个函数的能力,沿着这些思路

(2)仅在应用程序第一次运行时清除缓存的选项,因此您可以模拟应用程序被“强制关闭”。

于 2012-06-22T15:26:25.963 回答