【问题标题】:Programmatically clear PhoneGap/Cordova app's cache on Android to simulate a fresh install?以编程方式清除 Android 上的 PhoneGap/Cordova 应用程序缓存以模拟全新安装?
【发布时间】:2012-06-22 15:26:25
【问题描述】:

这与我之前的问题'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 by Igor Hrupin 涵盖了 native Android 应用程序的上下文中的情况,因此这个问题将其扩展到 Cordova。

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

【问题讨论】:

    标签: java android jquery cordova


    【解决方案1】:

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

    https://coderwall.com/p/aj79eg

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

    【讨论】:

    • 在什么版本的cordova中可以使用?确保 clearCache() 不会清除您可能存储在本地存储中的任何内容,这就是它当时所做的(在科尔多瓦 2.0 中)
    【解决方案2】:

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

    【讨论】:

    • 我也是——这就是我发布此内容时想要的。不过,您的答案比我的有所改进,所以请接受! :-)
    【解决方案3】:

    这个答案借用了this blog postIgor 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 调用此函数的能力,以及 these lines

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

    【讨论】:

    • 这也不起作用。我在 Kitkat 中测试,cordova 是 3.6
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    相关资源
    最近更新 更多