前言

本篇博客要给大家分享的如何获取应用缓存的大小和清除缓存的功能,我们知道我们应用当中经常会产生一些数据,比如图片的缓存,数据库文件,配置文件等等。我们开发产品的时候,可能会有这样的一个需求清除应用内缓存的数据,可以让用户选择删除应用内产生的数据,这也是比较人性化的设计点。例如笔者参与开发的一款产品的设置界面就提供了清除缓存的功能,如下图所示:


在贴一大段代码之前,先普及Android的相关知识点:

先看360手机助手的一张图:


从上面这张图,我们可以看到这部手机有

系统文件(注:这个是系统的文件系统,不允许修改的)

内置SD卡(注:现在的手机基本上都有,就是我们所谓的ROM,是不可以移除的,RAM是我们手机的运行内存)

外置SD卡(注:这个就是我们的SD卡了,可以移除)

我们来考虑一个问题我们应用内的缓存数据存放在哪里?

我们的应用程序一般会产生以下几种类型的数据:

file-普通的文件存储

database-数据库文件(.db文件)

sharedPreference-配置数据(.xml文件)

cache-图片缓存文件


应用内数据的所有路径:

/data/data/com.xxx.xxx/cache - 应用内缓存(注:对应方法getCacheDir())

/data/data/com.xxx.xxx/databases - 应用内数据库

/data/data/com.xxx.xxx/shared_prefs - 应用内配置文件

/data/data/com.xxx.xxx/files - 应用内文件(注:对应方法getFilesDir())


一种情况,我们没有外置SD卡,那么我们安装的应用安装在哪里?自然是手机中的内置SD卡里,具体路径是这样的:


那在Android是用什么方法来获取这个路径的:


如果我们手机有外置SD卡,我们也可以把应用安装在SD卡,但移除SD卡之后就不能使用了。



不管是内置还是外置SD卡,获取路径的方法是一样:

获取SD卡根目录:Environment.getExternalStorageDirectory().getAbsolutePath();

外部Cache路径:/mnt/sdcard/android/data/com.xxx.xxx/cache 一般存储缓存数据(注:通过getExternalCacheDir()获取)

外部File路径:/mnt/sdcard/android/data/com.xxx.xxx/files 存储长时间存在的数据 (注:通过getExternalFilesDir(String type)获取, type为特定类型,可以是以下任何一种

Environment.DIRECTORY_MUSIC, Environment.DIRECTORY_PODCASTS, Environment.DIRECTORY_RINGTONES, Environment.DIRECTORY_ALARMS, Environment.DIRECTORY_NOTIFICATIONS, Environment.DIRECTORY_PICTURES, or Environment.DIRECTORY_MOVIES. )


最后提供一个工具类:

DataCleanManager.java

[java] view plain copy
  1. packagecom.infzm.daily.know.utils;
  2. /**文件名:DataCleanManager.java
  3. **描述:主要功能有清除内/外缓存,清除数据库,清除sharedPreference,清除files和清除自定义目录
  4. **/
  5. importjava.io.File;
  6. importjava.math.BigDecimal;
  7. importandroid.content.Context;
  8. importandroid.os.Environment;
  9. importandroid.text.TextUtils;
  10. /***本应用数据清除管理器*/
  11. publicclassDataCleanManager{
  12. /**
  13. **清除本应用内部缓存(/data/data/com.xxx.xxx/cache)**
  14. *
  15. *@paramcontext
  16. */
  17. publicstaticvoidcleanInternalCache(Contextcontext){
  18. deleteFilesByDirectory(context.getCacheDir());
  19. }
  20. /**
  21. **清除本应用所有数据库(/data/data/com.xxx.xxx/databases)**
  22. *
  23. *@paramcontext
  24. */
  25. publicstaticvoidcleanDatabases(Contextcontext){
  26. deleteFilesByDirectory(newFile("/data/data/"
  27. +context.getPackageName()+"/databases"));
  28. }
  29. /**
  30. **清除本应用SharedPreference(/data/data/com.xxx.xxx/shared_prefs)*
  31. *
  32. *@paramcontext
  33. */
  34. publicstaticvoidcleanSharedPreference(Contextcontext){
  35. deleteFilesByDirectory(newFile("/data/data/"
  36. +context.getPackageName()+"/shared_prefs"));
  37. }
  38. /**
  39. **按名字清除本应用数据库**
  40. *
  41. *@paramcontext
  42. *@paramdbName
  43. */
  44. publicstaticvoidcleanDatabaseByName(Contextcontext,StringdbName){
  45. context.deleteDatabase(dbName);
  46. }
  47. /**
  48. **清除/data/data/com.xxx.xxx/files下的内容**
  49. *
  50. *@paramcontext
  51. */
  52. publicstaticvoidcleanFiles(Contextcontext){
  53. deleteFilesByDirectory(context.getFilesDir());
  54. }
  55. /**
  56. **清除外部cache下的内容(/mnt/sdcard/android/data/com.xxx.xxx/cache)
  57. *
  58. *@paramcontext
  59. */
  60. publicstaticvoidcleanExternalCache(Contextcontext){
  61. if(Environment.getExternalStorageState().equals(
  62. Environment.MEDIA_MOUNTED)){
  63. deleteFilesByDirectory(context.getExternalCacheDir());
  64. }
  65. }
  66. /**
  67. **清除自定义路径下的文件,使用需小心,请不要误删。而且只支持目录下的文件删除**
  68. *
  69. *@paramfilePath
  70. **/
  71. publicstaticvoidcleanCustomCache(StringfilePath){
  72. deleteFilesByDirectory(newFile(filePath));
  73. }
  74. /**
  75. **清除本应用所有的数据**
  76. *
  77. *@paramcontext
  78. *@paramfilepath
  79. */
  80. publicstaticvoidcleanApplicationData(Contextcontext,String...filepath){
  81. cleanInternalCache(context);
  82. cleanExternalCache(context);
  83. cleanDatabases(context);
  84. cleanSharedPreference(context);
  85. cleanFiles(context);
  86. if(filepath==null){
  87. return;
  88. }
  89. for(StringfilePath:filepath){
  90. cleanCustomCache(filePath);
  91. }
  92. }
  93. /**
  94. **删除方法这里只会删除某个文件夹下的文件,如果传入的directory是个文件,将不做处理**
  95. *
  96. *@paramdirectory
  97. */
  98. privatestaticvoiddeleteFilesByDirectory(Filedirectory){
  99. if(directory!=null&&directory.exists()&&directory.isDirectory()){
  100. for(Fileitem:directory.listFiles()){
  101. item.delete();
  102. }
  103. }
  104. }
  105. //获取文件
  106. //Context.getExternalFilesDir()-->SDCard/Android/data/你的应用的包名/files/目录,一般放一些长时间保存的数据
  107. //Context.getExternalCacheDir()-->SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据
  108. publicstaticlonggetFolderSize(Filefile)throwsException{
  109. longsize=0;
  110. try{
  111. File[]fileList=file.listFiles();
  112. for(inti=0;i<fileList.length;i++){
  113. //如果下面还有文件
  114. if(fileList[i].isDirectory()){
  115. size=size+getFolderSize(fileList[i]);
  116. }else{
  117. size=size+fileList[i].length();
  118. }
  119. }
  120. }catch(Exceptione){
  121. e.printStackTrace();
  122. }
  123. returnsize;
  124. }
  125. /**
  126. *删除指定目录下文件及目录
  127. *
  128. *@paramdeleteThisPath
  129. *@paramfilepath
  130. *@return
  131. */
  132. publicstaticvoiddeleteFolderFile(StringfilePath,booleandeleteThisPath){
  133. if(!TextUtils.isEmpty(filePath)){
  134. try{
  135. Filefile=newFile(filePath);
  136. if(file.isDirectory()){//如果下面还有文件
  137. Filefiles[]=file.listFiles();
  138. for(inti=0;i<files.length;i++){
  139. deleteFolderFile(files[i].getAbsolutePath(),true);
  140. }
  141. }
  142. if(deleteThisPath){
  143. if(!file.isDirectory()){//如果是文件,删除
  144. file.delete();
  145. }else{//目录
  146. if(file.listFiles().length==0){//目录下没有文件或者目录,删除
  147. file.delete();
  148. }
  149. }
  150. }
  151. }catch(Exceptione){
  152. //TODOAuto-generatedcatchblock
  153. e.printStackTrace();
  154. }
  155. }
  156. }
  157. /**
  158. *格式化单位
  159. *
  160. *@paramsize
  161. *@return
  162. */
  163. publicstaticStringgetFormatSize(doublesize){
  164. doublekiloByte=size/1024;
  165. if(kiloByte<1){
  166. returnsize+"Byte";
  167. }
  168. doublemegaByte=kiloByte/1024;
  169. if(megaByte<1){
  170. BigDecimalresult1=newBigDecimal(Double.toString(kiloByte));
  171. returnresult1.setScale(2,BigDecimal.ROUND_HALF_UP)
  172. .toPlainString()+"KB";
  173. }
  174. doublegigaByte=megaByte/1024;
  175. if(gigaByte<1){
  176. BigDecimalresult2=newBigDecimal(Double.toString(megaByte));
  177. returnresult2.setScale(2,BigDecimal.ROUND_HALF_UP)
  178. .toPlainString()+"MB";
  179. }
  180. doubleteraBytes=gigaByte/1024;
  181. if(teraBytes<1){
  182. BigDecimalresult3=newBigDecimal(Double.toString(gigaByte));
  183. returnresult3.setScale(2,BigDecimal.ROUND_HALF_UP)
  184. .toPlainString()+"GB";
  185. }
  186. BigDecimalresult4=newBigDecimal(teraBytes);
  187. returnresult4.setScale(2,BigDecimal.ROUND_HALF_UP).toPlainString()
  188. +"TB";
  189. }
    1. /**
    2. * 获取缓存大小
    3. *
    4. *@paramsize
    5. *@return
    6. */
  190. publicstaticStringgetCacheSize(Filefile)throwsException{
  191. returngetFormatSize(getFolderSize(file));
  192. }
  193. }

via:IT_xiao小巫

转载自:http://blog.csdn.net/wwj_748

更多相关文章

  1. android usb挂载分析--各种格式支持
  2. android 将res内图片文件通过Bitmap对象存到手机本地中
  3. Android应用瘦身,从18MB到12.5MB
  4. Android(安卓)动态解析布局,实现制作多套主题
  5. Android动态调试so库JNI_Onload函数-----基于IDA实现
  6. Android(安卓)数据存取试验 (一)
  7. 关于Android的主流网络请求框架(Okhttp 3 与 RxCache)缓存的那些事
  8. android上传大文件亲测可用,上传200M个文件,不到3分钟
  9. 浅谈Android系统编译apk后so文件在dlopen时出现linker权限问题

随机推荐

  1. Android(安卓)Navigation使用
  2. Android:SlidingMenu(侧滑菜单)用法示例
  3. 《Kotlin》 Android(安卓)Studio3.0 新特
  4. android service 例子(电话录音和获取系统
  5. android:inputType标签、textView限制输
  6. Android(安卓)Studio 3.0下Jni开发环境配
  7. [android研究联系人之二]联系人Email/Nic
  8. 解决给一组Button设置Background导致点击
  9. [转]Android中的BatteryService及相关组
  10. 让应用程序具体相应权限