Skip to content Skip to sidebar Skip to footer

Programmatically Clear Phonegap/cordova App's Cache On Android To Simulate A Fresh Install?

This is related to my previous question of 'How can I clear my app's localStorage on my Android emulator each time I install it?'. It also builds on 'How can I clear the Android ap

Solution 1:

just saw this one. It can be done with one line. I am not sure if this is what you want but it serves my purpose which is clearing the cache on startup

https://coderwall.com/p/aj79eg

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

Solution 2:

I wasn't able to force android to reload new versions of:

super.loadUrl("file:///android_asset/www/index.html");

between calls, so I first borrowed your code which worked well enough except that all data that my application was writing was deleted as well.

A quick and simple fix is to change the URL of the file above:

super.loadUrl("file:///android_asset/www/index.html?1");

And change the number behind the ? with each load. Eventually I added:

import java.util.Random;

publicclassMainActivityextendsDroidGap {
    @OverridepublicvoidonCreate(Bundle savedInstanceState) {
        Randomgenerator=newRandom();
        intr= generator.nextInt();
        super.onCreate(savedInstanceState);
        super.loadUrl("file:///android_asset/www/index.html?" + r);
    }
}

Now each time I rebuild the app it actually refreshes the cached version of the html file.

I'd very much like to know how to force loadUrl into a refresh from within the app itself, or to force it on reload.

Solution 3:

This answer borrows a lot of code from this blog post by Igor Hrupin.

Your Project > src > [com/org/whatever].[YourNameSpace].[ActivityNameHere] > [ActivityNameHere].java should look approximately like this for a normal PhoneGap app.

package [com/org/whatever].[YourNameSpace].[ActivityNameHere];

import org.apache.cordova.*;
import android.os.Bundle;

publicclass [ActivityNameHere] extendsDroidGap {
    @OverridepublicvoidonCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.loadUrl("file:///android_asset/www/index.html");
    }    
}

What we do is change it to look like the following code. Unchanged lines are commented out for clarity, but should be uncommented when implemented.

Please remember to replace [com/org/whatever], [YourNameSpace], and the multiple[ActivityNameHere] placeholders with your own values.

// 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 {privatestatic [ActivityNameHere] instance;

    // @Override// public void onCreate(Bundle savedInstanceState) {

           instance = this;
           [ActivityNameHere].getInstance().clearApplicationData();

    // super.onCreate(savedInstanceState);// super.loadUrl("file:///android_asset/www/index.html");// }publicstatic [ActivityNameHere] getInstance() {
       return instance;
   }

   publicvoidclearApplicationData() {
       File cache = getCacheDir();
       File appDir = newFile(cache.getParent());
       if (appDir.exists()) {
           String[] children = appDir.list();
           for (String s : children) {
               if (!s.equals("lib")) {
                   deleteDir(newFile(appDir, s));
                   Log.i("TAG", "**************** File /data/data/APP_PACKAGE/" + s + " DELETED *******************");
           }
       }
       }
   }

   publicstaticbooleandeleteDir(File dir) {
       if (dir != null && dir.isDirectory()) {
           String[] children = dir.list();
           for (int i = 0; i < children.length; i++) {
               boolean success = deleteDir(newFile(dir, children[i]));
               if (!success) {
                   returnfalse;
           }
       }
       }
           return dir.delete();
   }

// }

As stated in my question, I have no Java skills, so I hacked this together from what I could find and it seems to work. Please edit accordingly - I think this is something that should be available for people to effectively copy & paste when they need it, as the whole point of PhoneGap on Android is to abstract the developer from Java (which, for the record, I will get into learning once my current project is finished).

The code appears to work, at least in my case. It would be nice to add in -

(1) The ability to call this function from JS, along these lines.

and

(2) The choice to clear the cache only the first time the app is run, so you can simulate the app being 'force closed'.

Post a Comment for "Programmatically Clear Phonegap/cordova App's Cache On Android To Simulate A Fresh Install?"