1

Is there some way to programmatically clear the cache of an android app when upgrading to a new version or during an installation?

Lakmal Caldera
  • 1,001
  • 2
  • 12
  • 25
  • what kind of cache ? – Blackbelt Apr 16 '15 at 12:34
  • specifically web cache.. i'm running a webview in my app – Lakmal Caldera Apr 16 '15 at 12:35
  • webView.clearDisk(true); if you want to clear also the file on the disk – Blackbelt Apr 16 '15 at 12:36
  • Is it possible to do only once during first time installation or an upgrade? I don't want to do it every time when the app is running. Problem is when I upgrade i have html remnants from my previous version of the app. When i manually clear the cache from app info, those remnants are removed and everything looks fine.. i want to programmatically do this during an upgrade. Is it possible? – Lakmal Caldera Apr 16 '15 at 12:39
  • first time installation makes no sense. About the upgrade you can add write a version number on the sharedpreference and check against this number every time your app starts – Blackbelt Apr 16 '15 at 12:41
  • @Blackbelt Doesn't clearing the app data also remove any data saved in the sharedpreferences? – Endzeit Apr 16 '15 at 12:43
  • @Endzeit OP wants to clear the cache of the WebView he is using, no the app's data – Blackbelt Apr 16 '15 at 12:44
  • @Blackbelt I was refering to uncertain-eer answer, but you're right. – Endzeit Apr 16 '15 at 12:49

4 Answers4

0

android have clearApplicationUserData() in ActivityManager Class. this method will have the same effect as explicit hit on clear app data in settings do.

here's the reference--

http://developer.android.com/reference/android/app/ActivityManager.html#clearApplicationUserData()

hope this helps cheers!

0

Revering to this answer you can clear the app's cache the follwing way:

public static void deleteCache(Context context) {
    try {
        File dir = context.getCacheDir();
        if (dir != null && dir.isDirectory()) {
            deleteDir(dir);
        }
    } catch (Exception e) {}
}

private 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();
}

Simply call deleteCache() everytime your app is updated. To check whether you app is updated or not you can simply save the version string into a SharedPreference and compare the saved value with the actual one.

public static boolean isNewVersion(Context context) {
    String newVersion = "", oldVersion = "";

    PackageManager manager = context.getPackageManager();
    PackageInfo info = null;
    try {
        info = manager.getPackageInfo(context.getPackageName(), 0);
        newVersion = info.versionName;
    } catch (PackageManager.NameNotFoundException e) {
        // TODO what to do?
    }
    oldVersion = getVersionString();

    // returns whether the new version string differs (is also false for first install)
    return !(oldVersion.equals(DEFVAL_STRING) || oldVersion.equals(newVersion));
}

public static String getVersionString(Context context) {
     SharedPreferences preferences =    context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);        
     return preferences.getString(KEY_VERSION, DEFVAL_STRING);
}
Community
  • 1
  • 1
Endzeit
  • 4,810
  • 5
  • 29
  • 52
0

Write receiver with action "PACKAGE_REPLACED" in manifest.

    @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED)) {
                // write logic to delete cache directory 
                // Get cache dir as context.getCacheDir()
            }
        }
Harsha Vardhan
  • 3,324
  • 2
  • 17
  • 22
0

If you just want this for a webview, you can add cache busting to your urls loaded by the webview. Add the app version to the querystring and you'll get a fresh download after users upgrade:

"http://www.stackoverflow.com?v=" + BuildConfig.VERSION_NAME
bsautner
  • 4,479
  • 1
  • 36
  • 50