Android APP中清除缓存功能详解

现在很多APP中都有系统设置,这个模块中有一个缓存设置功能,用户可以查看当前APP缓存数据大小并且可以手动清空缓存数据。

缓存数据的统计分2块:内存(这里指的是应用程序包目录所在位置)+外存(外部存储卡)

我这里以开源中国APP数据缓存处理为例为大家讲解下


清除的目录包括:

1./data/data/package_name/files

2./data/data/package_name/cache

3.<sdcard>/Android/data/<package_name>/cache/

4.webview缓存数据

[plain] view plain copy print ?
  1. // 计算缓存大小  
  2.         long fileSize = 0;  
  3.         String cacheSize = "0KB";  
  4.         File filesDir = getFilesDir();// /data/data/package_name/files  
  5.         File cacheDir = getCacheDir();// /data/data/package_name/cache  
  6.   
  7.         fileSize += getDirSize(filesDir);  
  8.         fileSize += getDirSize(cacheDir);  
  9.   
  10. // 2.2版本才有将应用缓存转移到sd卡的功能  
  11.   
  12.         if(isMethodsCompat(android.os.Build.VERSION_CODES.FROYO)){  
  13.   
  14.             File externalCacheDir = getExternalCacheDir(this);//"<sdcard>/Android/data/<package_name>/cache/"  
  15.             fileSize += getDirSize(externalCacheDir);             
  16.   
  17.         }  
  18.   
  19.        if (fileSize > 0)  
  20.             cacheSize = formatFileSize(fileSize);  
  21.   
  22. /**  
  23.      * 获取目录文件大小  
  24.      *  
  25.      * @param dir  
  26.      * @return  
  27.      */  
  28.     public static long getDirSize(File dir) {  
  29.         if (dir == null) {  
  30.             return 0;  
  31.         }  
  32.         if (!dir.isDirectory()) {  
  33.             return 0;  
  34.         }  
  35.         long dirSize = 0;  
  36.         File[] files = dir.listFiles();  
  37.         for (File file : files) {  
  38.             if (file.isFile()) {  
  39.                 dirSize += file.length();  
  40.             } else if (file.isDirectory()) {  
  41.                 dirSize += file.length();  
  42.                 dirSize += getDirSize(file); // 递归调用继续统计  
  43.             }  
  44.         }  
  45.         return dirSize;  
  46.     }  
  47.   
  48. /**  
  49.      * 判断当前版本是否兼容目标版本的方法  
  50.      * @param VersionCode  
  51.      * @return  
  52.      */  
  53.     public static boolean isMethodsCompat(int VersionCode) {  
  54.         int currentVersion = android.os.Build.VERSION.SDK_INT;  
  55.         return currentVersion >= VersionCode;  
  56.     }  
  57.   
  58. @TargetApi(8)  
  59.     public static File getExternalCacheDir(Context context) {  
  60.   
  61.        // return context.getExternalCacheDir(); API level 8  
  62.   
  63.         // e.g. "<sdcard>/Android/data/<package_name>/cache/"  
  64.   
  65.         return context.getExternalCacheDir();  
  66.     }  
  67.   
  68. /**  
  69.      * 转换文件大小  
  70.      *  
  71.      * @param fileS  
  72.      * @return B/KB/MB/GB  
  73.      */  
  74.     public static String formatFileSize(long fileS) {  
  75.         java.text.DecimalFormat df = new java.text.DecimalFormat("#.00");  
  76.         String fileSizeString = "";  
  77.         if (fileS < 1024) {  
  78.             fileSizeString = df.format((double) fileS) + "B";  
  79.         } else if (fileS < 1048576) {  
  80.             fileSizeString = df.format((double) fileS / 1024) + "KB";  
  81.         } else if (fileS < 1073741824) {  
  82.             fileSizeString = df.format((double) fileS / 1048576) + "MB";  
  83.         } else {  
  84.             fileSizeString = df.format((double) fileS / 1073741824) + "G";  
  85.         }  
  86.         return fileSizeString;  
  87.     }  
  88.   
  89. /**  
  90.      * 清除app缓存  
  91.      *  
  92.      * @param activity  
  93.      */  
  94.     public static void clearAppCache(Activity activity) {  
  95.         final AppContext ac = (AppContext) activity.getApplication();  
  96.         final Handler handler = new Handler() {  
  97.             public void handleMessage(Message msg) {  
  98.                 if (msg.what == 1) {  
  99.                     ToastMessage(ac, "缓存清除成功");  
  100.                 } else {  
  101.                     ToastMessage(ac, "缓存清除失败");  
  102.                 }  
  103.             }  
  104.         };  
  105.         new Thread() {  
  106.             public void run() {  
  107.                 Message msg = new Message();  
  108.                 try {  
  109.                     ac.clearAppCache();  
  110.                     msg.what = 1;  
  111.                 } catch (Exception e) {  
  112.                     e.printStackTrace();  
  113.                     msg.what = -1;  
  114.                 }  
  115.                 handler.sendMessage(msg);  
  116.             }  
  117.         }.start();  
  118.     }  
  119.   
  120. 在项目中经常会使用到WebView 控件,当加载html 页面时,会在/data/data/package_name目录下生成database与cache 两个文件夹。请求的url 记录是保存在WebViewCache.db,而url 的内容是保存在WebViewCache 文件夹下  
  121.   
  122. /**  
  123.      * 清除app缓存  
  124.      */  
  125.     public void clearAppCache()  
  126.     {  
  127.         //清除webview缓存  
  128.         @SuppressWarnings("deprecation")  
  129.         File file = CacheManager.getCacheFileBaseDir();   
  130.   
  131.        //先删除WebViewCache目录下的文件  
  132.   
  133.         if (file != null && file.exists() && file.isDirectory()) {    
  134.             for (File item : file.listFiles()) {    
  135.                 item.delete();    
  136.             }    
  137.             file.delete();    
  138.         }              
  139.         deleteDatabase("webview.db");    
  140.         deleteDatabase("webview.db-shm");    
  141.         deleteDatabase("webview.db-wal");    
  142.         deleteDatabase("webviewCache.db");    
  143.         deleteDatabase("webviewCache.db-shm");    
  144.         deleteDatabase("webviewCache.db-wal");    
  145.         //清除数据缓存  
  146.         clearCacheFolder(getFilesDir(),System.currentTimeMillis());  
  147.         clearCacheFolder(getCacheDir(),System.currentTimeMillis());  
  148.         //2.2版本才有将应用缓存转移到sd卡的功能  
  149.         if(isMethodsCompat(android.os.Build.VERSION_CODES.FROYO)){  
  150.             clearCacheFolder(getExternalCacheDir(this),System.currentTimeMillis());  
  151.         }  
  152.   
  153.     }      
  154.       
  155.     /**  
  156.      * 清除缓存目录  
  157.      * @param dir 目录  
  158.      * @param numDays 当前系统时间  
  159.      * @return  
  160.      */  
  161.     private int clearCacheFolder(File dir, long curTime) {            
  162.         int deletedFiles = 0;           
  163.         if (dir!= null && dir.isDirectory()) {               
  164.             try {                  
  165.                 for (File child:dir.listFiles()) {      
  166.                     if (child.isDirectory()) {                
  167.                         deletedFiles += clearCacheFolder(child, curTime);            
  168.                     }    
  169.                     if (child.lastModified() < curTime) {       
  170.                         if (child.delete()) {                     
  171.                             deletedFiles++;             
  172.                         }      
  173.                     }      
  174.                 }               
  175.             } catch(Exception e) {         
  176.                 e.printStackTrace();      
  177.             }       
  178.         }         
  179.         return deletedFiles;       
  180.     } 

你可能感兴趣的:(Android APP中清除缓存功能详解)