最近项目开发新增清除缓存需求,于是查阅相关资料并结合功能的实现过程,对手机存储的相关知识做下总结。
首先看下这张图:
可以看到,我们把手机存储分为了内部存储和外部存储。
1. 内部存储
内部存储指的是存储在手机 /data/data/<应用包名> 目录下的数据,附上一张高清无码大图。
从图中可以看到(注意:手机没 ROOT 是无法打开该文件夹的),内部存储有以下几种我们熟悉的数据:
files——文件存储(注:其对应路径 /data/data/<应用包名>/files 可通过 context.getFilesDir() 获取)
shared_prefs——sharedPreference 存储
cache——图片缓存(注:其对应路径 /data/data/<应用包名>/cache 可通过 context.getCacheDir() 获取,由于我的项目中用到了 Glide,所以发现 Glide 的图片存在了该目录下的 image_manager_disk_chache 文件夹内)
databases——数据库存储
2. 外部存储
外部存储分为内置 SD 卡存储和拓展卡存储(外置 SD 卡)。
- 内置 SD 卡:现在出产的手机基本都自带的,也就是我们常说的存储空间,有 16G,32G,64G,128G(以前的部分老旧低端机没有内置 SD 卡)
- 外置 SD 卡:可以插入手机的存储卡,扩大手机存储内存
特别注意下,一般我们在新建文件夹的时候需要判断一下手机是否有 SD 卡,代码如下(项目中碰到的坑):
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
对于 SD 卡的路径 /storage/sdcard,我们可以通过 Enviroment 中的方法获取到。
Environment.getExternalStorageDirectory()
SD 卡的文件路径也可以分为公有路径和私有路径。
2.1 公有路径
公有路径的获取方式如下:
Environment.getExternalStoragePublicDirectory(String type)
其参数共有 10 种类型,对应的参数和路径如下表:
参数 | 路径 |
---|---|
Environment.DIRECTORY_MUSIC | /storage/sdcard0/Music |
DIRECTORY_PODCASTS | /storage/sdcard0/Podcasts |
DIRECTORY_RINGTONES | /storage/sdcard0/Ringtones |
DIRECTORY_ALARMS | /storage/sdcard0/Alarms |
DIRECTORY_NOTIFICATIONS | /storage/sdcard0/Notifications |
DIRECTORY_PICTURES | /storage/sdcard0/Pictures |
DIRECTORY_MOVIES | /storage/sdcard0/Movies |
DIRECTORY_DOWNLOADS | /storage/sdcard0/Download |
DIRECTORY_DCIM | /storage/sdcard0/DCIM |
DIRECTORY_DOCUMENTS | /storage/sdcard0/Documents |
2.2 私有目录
在 SD 卡目录下的 Android 文件夹就是对应的私有目录。打开 Android 目录,可以看到里面还有 data 文件夹,再打开这个文件夹,就是许多应用包名组成的文件夹。可以发现这些包名文件夹里面基本都包含有 files 和 cache 这两个文件夹。这两个文件夹的路径可以通过如下方法获取:
files——sdcard/Android/data/应用包名/files(注:可通过 context.getExternalFilesDir() 获取)
cache——sdcard/Android/data/应用包名/cache(注:可通过 context.getExternalCacheDir() 获取)
当调用 getExternalFilesDir() 和 getExternalCacheDir() 即可创建 files 和 cache 文件夹。看到这,你或许会问:
这两个文件夹不是和我们上面看到的内部存储一样吗,为什么要存在这里面呢。
原因在于内部存储空间有限,我们一般都是操作外部存储空间,虽然我们可以获得内部存储的路径,但是我们基本不会去操作内部空间,何况在没有 ROOT 情况下,也没法进行操作。而且 Google 官方也建议我们在外部存储的私有目录下进行数据存储操作。
这是或许你又会问:
很多 APP 都是在 SD 卡目录下创建文件进行数据存储操作的。
的确,很多 APP 是这么干的,但是当用户卸载 APP 的时候,内部存储中的包名文件夹及相关数据会被删除,外部存储的私有目录下相关数据也会跟随包名文件夹一起被删除,但是自己创建的文件夹是不会被删除的。在 sdcard 目录下创建文件不仅不利于系统维护,也会造成用户的反感(反正我是会经常去删除 SD 卡目录下的空文件夹)。
这时候我们再回到清除缓存这个功能上。对于需要被清除的数据,应该是内部存储中相应的 files 和 cache 文件夹内的数据和外部存储私有目录下相应的 files 和 cache 文件夹内的数据(可根据需求清除 files 文件夹内的相应数据)。
最后附上一个清除缓存数据的类:
|
|