• Android 缓存清理实现工具类


            所有Android设备都有两个文件存储区域:内部存储空间(internal Storage)和外部存储空间(external Storage)。这些名称是在Android早期确定的,那时候大部分设备都提供内置的非易失性内存(内部存储空间)以及可移动存储媒介(如,Micro SD卡,提供外部存储空间)。现在,很多设备将永久性存储空间划分为单独的“内部”和“外部”分区。因此,即使没有可移动存储媒介,这两种存储空间也始终存在,并且无论外部存储空间是否可移动,这两种存储空间的API行为在Android系统上都是相同的。

     可参考:Android内、外存储分区&常用存储目录详解(Android Q)_大渔歌_的博客-CSDN博客

    以下为两个清除应用缓存的工具类

    1.DataCleanManager.java

    1. /** * 本应用数据清除管理器 */
    2. public class DataCleanManager {
    3. private static final String TAG = "DataCleanManager";
    4. public static String getTotalCacheSize(Context context) throws Exception {
    5. long cacheSize = getFolderSize(context.getCacheDir());
    6. Log.v(TAG,"cacheSize=="+cacheSize);
    7. if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
    8. cacheSize += getFolderSize(context.getExternalCacheDir());
    9. Log.v(TAG,"cacheSize2=="+ getFolderSize(context.getExternalCacheDir()));
    10. }
    11. return getFormatSize(cacheSize);
    12. }
    13. //删除内外缓存
    14. public static void clearAllCache(Context context) {
    15. deleteDir(context.getCacheDir());
    16. if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
    17. deleteDir(context.getExternalCacheDir());
    18. }
    19. }
    20. private static boolean deleteDir(File dir) {
    21. if (dir != null && dir.isDirectory()) {
    22. String[] children = dir.list();
    23. for (int i = 0; i < children.length; i++) {
    24. boolean success = deleteDir(new File(dir, children[i]));
    25. if (!success) {
    26. return false;
    27. }
    28. }
    29. }
    30. return dir.delete();
    31. }
    32. // 获取文件
    33. //Context.getExternalFilesDir() --> SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据
    34. //Context.getExternalCacheDir() --> SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据
    35. public static long getFolderSize(File file) throws Exception {
    36. long size = 0;
    37. try {
    38. File[] fileList = file.listFiles();
    39. for (int i = 0; i < fileList.length; i++) {
    40. // 如果下面还有文件
    41. if (fileList[i].isDirectory()) {
    42. size = size + getFolderSize(fileList[i]);
    43. } else {
    44. size = size + fileList[i].length();
    45. }
    46. }
    47. } catch (Exception e) {
    48. e.printStackTrace();
    49. }
    50. return size;
    51. }
    52. /**
    53. * 格式化单位
    54. *
    55. * @param size
    56. * @return
    57. */
    58. public static String getFormatSize(long size) {
    59. Log.v(TAG,"size=="+size);
    60. double kiloByte = size/1024;
    61. if (kiloByte < 1) {
    62. return size/1024 + "kB";
    63. }
    64. double megaByte = kiloByte/1024;
    65. if (megaByte < 1) {
    66. BigDecimal result1 = new BigDecimal(Double.toString(kiloByte));
    67. return result1.setScale(1, BigDecimal.ROUND_HALF_UP)
    68. .toPlainString() + "KB";
    69. }
    70. double gigaByte = megaByte / 1024;
    71. if (gigaByte < 1) {
    72. BigDecimal result2 = new BigDecimal(Double.toString(megaByte));
    73. return result2.setScale(1, BigDecimal.ROUND_HALF_UP)
    74. .toPlainString() + "MB";
    75. }
    76. double teraBytes = gigaByte / 1024;
    77. if (teraBytes < 1) {
    78. BigDecimal result3 = new BigDecimal(Double.toString(gigaByte));
    79. return result3.setScale(2, BigDecimal.ROUND_HALF_UP)
    80. .toPlainString() + "GB";
    81. }
    82. BigDecimal result4 = new BigDecimal(teraBytes);
    83. return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString()
    84. + "TB";
    85. }
    86. }
    • 获取缓存
      String resultCache = DataCleanManager.getTotalCacheSize(context);
    • 删除缓存
    DataCleanManager.clearAllCache(context);

    2. DateclearManager.java

    1. public class DateclearManager {
    2. /** * 清除本应用内部缓存(/data/data/com.xxx.xxx/cache) * * @param context */
    3. public static void cleanInternalCache(Context context) {
    4. deleteFilesByDirectory(context.getCacheDir());
    5. }
    6. /** * 清除本应用所有数据库(/data/data/com.xxx.xxx/databases) * * @param context */
    7. public static void cleanDatabases(Context context) {
    8. deleteFilesByDirectory(new File("/data/data/"
    9. + context.getPackageName() + "/databases"));
    10. }
    11. /**
    12. * * 清除本应用SharedPreference(/data/data/com.xxx.xxx/shared_prefs) * * @param
    13. * context
    14. */
    15. public static void cleanSharedPreference(Context context) {
    16. deleteFilesByDirectory(new File("/data/data/"
    17. + context.getPackageName() + "/shared_prefs"));
    18. }
    19. /** * 按名字清除本应用数据库 * * @param context * @param dbName */
    20. public static void cleanDatabaseByName(Context context, String dbName) {
    21. context.deleteDatabase(dbName);
    22. }
    23. /** * 清除/data/data/com.xxx.xxx/files下的内容 * * @param context */
    24. public static void cleanFiles(Context context) {
    25. deleteFilesByDirectory(context.getFilesDir());
    26. }
    27. /**
    28. * * 清除外部cache下的内容(/mnt/sdcard/android/data/com.xxx.xxx/cache) * * @param
    29. * context
    30. */
    31. public static void cleanExternalCache(Context context) {
    32. if (Environment.getExternalStorageState().equals(
    33. Environment.MEDIA_MOUNTED)) {
    34. deleteFilesByDirectory(context.getExternalCacheDir());
    35. }
    36. }
    37. /** * 清除自定义路径下的文件,使用需小心,请不要误删。而且只支持目录下的文件删除 * * @param filePath */
    38. public static void cleanCustomCache(String filePath) {
    39. deleteFilesByDirectory(new File(filePath));
    40. }
    41. /** * 清除本应用所有的数据 * * @param context * @param filepath */
    42. public static void cleanApplicationData(Context context, String... filepath) {
    43. cleanInternalCache(context);
    44. cleanExternalCache(context);
    45. cleanDatabases(context);
    46. cleanSharedPreference(context);
    47. cleanFiles(context);
    48. for (String filePath : filepath) {
    49. cleanCustomCache(filePath);
    50. }
    51. }
    52. /**
    53. *删除方法 这里只会删除某个文件夹下的文件,如果传入的directory是个文件,将不做处理
    54. * @param directory
    55. */
    56. private static void deleteFilesByDirectory(File directory) {
    57. if (directory != null && directory.exists() && directory.isDirectory()) {
    58. for (File item : directory.listFiles()) {
    59. item.delete();
    60. }
    61. }
    62. }
    63. /**
    64. * 获得所有缓存数据的大小
    65. * @param context
    66. * @return
    67. * @throws Exception
    68. */
    69. public static String getTotalCacheSize(Context context) throws Exception {
    70. long cacheSize = getFolderSize(context.getCacheDir());
    71. if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
    72. cacheSize += getFolderSize(context.getExternalCacheDir());
    73. }
    74. return getFormatSize(cacheSize);
    75. }
    76. //清空缓存
    77. public static void clearAllCache(Context context) {
    78. deleteDir(context.getCacheDir());
    79. if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
    80. deleteDir(context.getExternalCacheDir());
    81. }
    82. }
    83. //删除文件
    84. private static boolean deleteDir(File dir) {
    85. if (dir != null && dir.isDirectory()) {
    86. String[] children = dir.list();
    87. for (int i = 0; i < children.length; i++) {
    88. boolean success = deleteDir(new File(dir, children[i]));
    89. if (!success) {
    90. return false;
    91. }
    92. }
    93. }
    94. return dir.delete();
    95. }
    96. // 获取文件大小
    97. //Context.getExternalFilesDir() --> SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据
    98. //Context.getExternalCacheDir() --> SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据
    99. public static long getFolderSize(File file) throws Exception {
    100. long size = 0;
    101. try {
    102. File[] fileList = file.listFiles();
    103. for (int i = 0; i < fileList.length; i++) {
    104. // 如果下面还有文件
    105. if (fileList[i].isDirectory()) {
    106. size = size + getFolderSize(fileList[i]);
    107. } else {
    108. size = size + fileList[i].length();
    109. }
    110. }
    111. } catch (Exception e) {
    112. e.printStackTrace();
    113. }
    114. return size;
    115. }
    116. /**
    117. * 格式化文件的单位 转化文件单位
    118. * @param size
    119. * @return
    120. */
    121. public static String getFormatSize(double size) {
    122. double kiloByte = size / 1024;
    123. if (kiloByte < 1) {
    124. // return size + "Byte";
    125. return "0K";
    126. }
    127. double megaByte = kiloByte / 1024;
    128. if (megaByte < 1) {
    129. BigDecimal result1 = new BigDecimal(Double.toString(kiloByte));
    130. return result1.setScale(2, BigDecimal.ROUND_HALF_UP)
    131. .toPlainString() + "KB";
    132. }
    133. double gigaByte = megaByte / 1024;
    134. if (gigaByte < 1) {
    135. BigDecimal result2 = new BigDecimal(Double.toString(megaByte));
    136. return result2.setScale(2, BigDecimal.ROUND_HALF_UP)
    137. .toPlainString() + "MB";
    138. }
    139. double teraBytes = gigaByte / 1024;
    140. if (teraBytes < 1) {
    141. BigDecimal result3 = new BigDecimal(Double.toString(gigaByte));
    142. return result3.setScale(2, BigDecimal.ROUND_HALF_UP)
    143. .toPlainString() + "GB";
    144. }
    145. BigDecimal result4 = new BigDecimal(teraBytes);
    146. return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString()
    147. + "TB";
    148. }
    149. }
  • 相关阅读:
    月入18000,0基础转行软件测试,实现薪资翻倍我只用了135天
    【小程序源码】特效语音支持多种音效
    StyleLint入门配置
    两整数之和 ---- 位运算
    C语言课程设计题目汇总与要求
    【打工日常】使用docker部署StackEdit编辑器-Markdown之利器
    5-RabbitMQ工作模式-Publish/Subscribe发布与订阅模式
    Stream流
    微信快捷回复怎么设置?
    [附源码]计算机毕业设计JAVA面向服装集群企业的个性化定制服务系统
  • 原文地址:https://blog.csdn.net/gqg_guan/article/details/127903932