前几天和朋友聊到了APP清除数据这块,聊到了清除数据都会清掉哪些数据,我们每个人的手机在”设置–>应用管理”里面,选择任意一个App,都会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的时候又是清除的哪里的数据?今天在这里验证一下。
在学习之前我们首先要搞懂内存、内部存储、外部存储的概念,内存,我们在英文中称作memory,内部存储,我们称为InternalStorage,外部存储,我们称为ExternalStorage,他们的区别在于:
内存
内存是指手机运行程序时占用的内存,也叫RAM(简称运存)。RAM基本是固定不变的,手机买下来是多少就是多少,比如是4G运行内存,那么你的手机运行时候系统可以利用的内存最高也就是4G了,这个有别于电脑的内存(电脑内存可以通过添加内存条来增加RAM大小从而提升运行效率/速度),简而言之,理论上的手机运行内存越大,系统运行的越流畅。
内部存储
data文件夹就是我们常说的内部存储,(路径为:/data/data/包名)当我们打开data文件夹之后(没有root的手机不能打开该文件夹),里边有两个文件夹值得我们关注,如下:
app文件夹:app文件夹里存放着我们所有安装的app的apk文件,其实,当我们调试一个app的时候,可以看到控制台输出的内容,有一项是uploading …..就是上传我们的apk到这个文件夹,上传成功之后才开始安装。
data文件夹:这个文件夹里边都是一些包名,打开这些包名之后我们会看到这样的一些文件:
data/data/包名/shared_prefs //SharedPreferences存储的数据,以XML格式存储到本地
data/data/包名/databases //数据库存储的数据,db格式的文件
data/data/包名/files //普通数据的存储
data/data/包名/cache //缓存文件的存储
- 1
- 2
- 3
- 4
存储在这里的文件我们都称之为内部存储。存储在内部存储的数据都会随着APP的卸载而清除。
外部存储
,外部存储一般就是我们上面看到的storage文件夹,当然也有可能是mnt文件夹,这个不同厂家有可能不一样。测试使用的手机目录为(/storage/emulated/0/)。这个文件夹中的文件又分为两类,一类是公有目录,还有一类是私有目录。
公有目录:
Environment.getExternalStoragePublicDirectory(String DirName) | /storage/emulated/0/DirName |
Environment.DIRECTORY_MUSIC | /storage/emulated/0/Music |
Environment.DIRECTORY_PODCASTS | /storage/emulated/0/Podcasts |
Environment.DIRECTORY_RINGTONES | /storage/emulated/0/Ringtones |
Environment.DIRECTORY_ALARMS | /storage/emulated/0/Alarms |
Environment.DIRECTORY_NOTIFICATIONS | /storage/emulated/0/Notifications |
Environment.DIRECTORY_PICTURES | /storage/emulated/0/Pictures |
Environment.DIRECTORY_MOVIES | /storage/emulated/0/Movies |
Environment.DIRECTORY_DOWNLOADS | /storage/emulated/0/Download |
Environment.DIRECTORY_DCIM | /storage/emulated/0/DCIM |
Environment.DIRECTORY_DOCUMENTS | /storage/emulated/0/Documents |
私有目录
私有目录就是Android这个文件夹,这个文件夹打开之后里边有一个data文件夹,打开这个data文件夹,里边有许多包名组成的文件夹。
例:/storage/emulated/0/Android/data/包名
常用方法
经过上面的分析,大家已经明白了,什么是内部存储,什么是外部存储,以及这两种存储方式分别存储在什么位置,一般来说,我们不会自己去操作内部存储空间,没有root权限的话,我们也没法操作内部存储空间,事实上内部存储主要是由系统来维护的。不过在代码中我们是可以访问到这个文件夹的。由于内部存储空间有限,在开发中我们一般都是操作外部存储空间,Google官方建议我们App的数据应该存储在外部存储的私有目录中该App的包名下,这样当用户卸载掉App之后,相关的数据会一并删除。
内部存储方法 | 获取的目录 |
getFilesDir() | /data/data/packagename/files |
getCacheDir() | /data/data/packagename/cache |
外部存储方法 | 获取的目录 |
getExternalCacheDir() | /storage/emulated/0/Android/data/包名/cache |
getExternalFilesDir() | /storage/emulated/0/Android/data/包名/files |
getExternalStorageDirectory() | /storage/emulated/0 |
getExternalStoragePublicDirectory(String DirName) | /storage/emulated/0/DirName |
getExternalFilesDir(String DirName) | /storage/emulated/0/Android/data/包名/files/DirName |
getExternalStorageState() | 获取外部存储状态(可用状态Environment.MEDIA_MOUNTED) |
文件存储的路径分为两种,一类是路径中含有包名的,一类是路径中不含有包名的,含有包名的路径,因为和某个App有关,所以对这些文件夹的访问都是调用Context里边的方法,而不含有包名的路径,和某一个App无关,我们可以通过Environment中的方法来访问。
在了解了三种存储的概念之后,再回过头来看清除数据和清除缓存就容易理解了。
清除数据
清除数据主要是清除用户配置,比如SharedPreferences、数据库等等,这些数据都是在程序运行过程中保存的用户配置信息,清除数据后,下次进入程序就和第一次进入程序时一样;
清除缓存
缓存是程序运行时的临时存储空间,它可以存放从网络下载的临时图片,从用户的角度出发清除缓存对用户并没有太大的影响,但是清除缓存后用户再次使用该APP时,由于本地缓存已经被清理,所有的数据需要重新从网络上获取,注意:为了在清除缓存的时候能够正常清除与应用相关的缓存,请将缓存文件存放在getCacheDir()或者 getExternalCacheDir()路径下。比如对微信清除缓存,则聊天记录、朋友圈缓存的用户头像、图片、文字等信息都会被清除掉,清除缓存后再次进入微信时你会发现消息记录被清空了,朋友圈的图片和用户头像需要加载一会才能正常显示。
一键清理
一键清理是系统级别的功能,它主要是杀后台进程,以达到释放内存的目的,APP缓存的数据并不会被清理掉。杀掉哪些进程和清理时设置的重要值阈值有关,重要值越大说明进程重要程度越低,如果在清理时某个进程的重要值大于该阈值,该进程就会被杀掉。比如微信等应用在后台,一件清理后会将微信和与之相关的服务都杀掉(有的服务做了特殊处理,杀不死!!!)。
总结
为了让程序被卸载后不在文件系统中留下毫无关联的无用文件,建议将应用相关的配置和缓存文件存放在程序被卸载时会删掉的文件夹下面(音乐文件、视频文件、图片、电子书这种适合多个应用阅读和浏览的文件除外),具体路径有:
- /data/data/package/
- getFilesDir()
- getCacheDir()
- getExternalCacheDir()(是否能够在程序被卸载时被删除与API的等级有关)
- getExternalFilesDir()(是否能够在程序被卸载时被删除与API的等级有关)