如何清除Android应用缓存?

时间:2011-12-12 12:40:10

标签: android

我正在编写一个应用程序,它可以编程方式清除设备上安装的所有第三方应用程序的应用程序缓存。以下是Android 2.2的代码段

public static void trimCache(Context myAppctx) {

    Context context = myAppctx.createPackageContext("com.thirdparty.game", 
            Context.CONTEXT_INCLUDE_CO|Context.CONTEXT_IGNORE_SECURITY);

    File cachDir = context.getCacheDir();        
    Log.v("Trim", "dir " + cachDir.getPath());

    if (cachDir!= null && cachDir.isDirectory()) {

        Log.v("Trim", "can read " + cachDir.canRead());
        String[] fileNames = cachDir.list();
        //Iterate for the fileName and delete
    }
}

我的清单有以下权限:

  

android.permission.CLEAR_APP_CACHE
  android.permission.DELETE_CACHE_FILES

现在的问题是打印了缓存目录的名称,但文件列表cachDir.list()始终返回null。我无法删除缓存目录,因为文件列表始终为null。

还有其他方法可以清除应用程序缓存吗?

4 个答案:

答案 0 :(得分:6)

  

“android.permission.CLEAR_APP_CACHE”android.permission.DELETE_CACHE_FILES“

普通SDK应用程序无法保留DELETE_CACHE_FILES权限。虽然您可以按住CLEAR_APP_CACHE,但Android SDK中没有任何内容可以让您清除应用的缓存。

  

还有其他方法可以清除应用程序缓存吗?

欢迎您通过删除该缓存中的文件来清除自己的缓存。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

检查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/ 该类中的其他隐藏方法也可能有用。

如果以前从未使用过隐藏方法,可以使用Java反射访问隐藏方法。

答案 3 :(得分:0)

我不确定这在约定方面是多么合适,但在我的全球应用程序类中这对我来说是有效的:

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

当然,这不会解决嵌套目录,这可能是通过这样的递归函数完成的(未经过子目录的广泛测试):

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

我没有使用File.isDirectory因为它在我的测试中不可靠。