How can I clear the Android app cache?

前端 未结 4 1006
青春惊慌失措
青春惊慌失措 2020-12-03 06:04

I am writing a app which can programatically clear application cache of all the third party apps installed on the device. Following is the code snippet for Android 2.2

相关标签:
4条回答
  • 2020-12-03 06:42

    "android.permission.CLEAR_APP_CACHE" android.permission.DELETE_CACHE_FILES"

    Ordinary SDK applications cannot hold the DELETE_CACHE_FILES permission. While you can hold CLEAR_APP_CACHE, there is nothing in the Android SDK that allows you to clear an app's cache.

    Is there any other way to clear the application cache?

    You are welcome to clear your own cache by deleting the files in that cache.

    0 讨论(0)
  • 2020-12-03 06:44

    Check out android.content.pm.PackageManager.clearApplicationUserData: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3.3_r1/android/content/pm/PackageManager.java/ The other hidden methods in that class might be useful, too.

    In case you've never used hidden methods before, you can access hidden methods using Java reflection.

    0 讨论(0)
  • 2020-12-03 06:45

    I'm not sure how appropriate this is in terms of convention, but this works so far for me in my Global Application class:

        File[] files = cacheDir.listFiles();
        for (File file : files){
            file.delete();
        }
    

    Of course, this doesn't address nested directories, which might be done with a recursive function like this (not tested extensively with subdirectories):

    deleteFiles(cacheDir);
    
    private void deleteFiles(File dir){
        if (dir != null){
            if (dir.listFiles() != null && dir.listFiles().length > 0){
                // RECURSIVELY DELETE FILES IN DIRECTORY
                for (File file : dir.listFiles()){
                    deleteFiles(file);
                }
            } else {
                // JUST DELETE FILE
                dir.delete();
            }
        }
    }
    

    I didn't use File.isDirectory because it was unreliable in my testing.

    0 讨论(0)
  • 2020-12-03 06:57

    poate iti merge asta

    static int clearCacheFolder(final File dir, final int numDays) {
    
            int deletedFiles = 0;
            if (dir!= null && dir.isDirectory()) {
                try {
                    for (File child:dir.listFiles()) {
    
                        //first delete subdirectories recursively
                        if (child.isDirectory()) {
                            deletedFiles += clearCacheFolder(child, numDays);
                        }
    
                        //then delete the files and subdirectories in this dir
                        //only empty directories can be deleted, so subdirs have been done first
                        if (child.lastModified() < new Date().getTime() - numDays * DateUtils.DAY_IN_MILLIS) {
                            if (child.delete()) {
                                deletedFiles++;
                            }
                        }
                    }
                }
                catch(Exception e) {
                    Log.e("ATTENTION!", String.format("Failed to clean the cache, error %s", e.getMessage()));
                }
            }
            return deletedFiles;
        }
    
        public static void clearCache(final Context context, final int numDays) {
            Log.i("ADVL", String.format("Starting cache prune, deleting files older than %d days", numDays));
            int numDeletedFiles = clearCacheFolder(context.getCacheDir(), numDays);
            Log.i("ADVL", String.format("Cache pruning completed, %d files deleted", numDeletedFiles));
        }
    
    0 讨论(0)
提交回复
热议问题