前几天和朋友聊到了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 //缓存文件的存储

存储在这里的文件我们都称之为内部存储。存储在内部存储的数据都会随着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的等级有关)

转载---------------------
作者:oudetu
来源:CSDN
原文:https://blog.csdn.net/oudetu/article/details/78664514
版权声明:本文为此博主原创文章,转载请附上博文链接!

Android存储扩展学习-----应用的清除数据和清除缓存的更多相关文章

  1. 一篇文章搞懂android存储目录结构

    前言 前两天因为开发一个app更新的功能,我将从服务器下载的apk文件放在了内部存储目录(测试手机为小米,路径为:data/user/0/packagename/files)下面,然后安装的时候一直安 ...

  2. android 存储目录

    之前一直不知道 sdcard/Android目录什么作用,我做的项目里面缓存数据到本地一般都是在sdcard上面建一个文件,然后把数据放在这个文件夹下面的子文件夹下.下面介绍一种更好的解决方法. 应用 ...

  3. Android课程---关于数据存储的学习(2)

    手机外部存储的学习 activity_data2.xml <?xml version="1.0" encoding="utf-8"?> <Li ...

  4. Android简单介绍SharedPreference,内部文件,sdcard数据存储

    SharedPreference 以xml的结构储存简单的数据,储存在data/data/程序包名/shared_prefs文件夹中 使用方式 创建对象的方式有三种 Context 的 getShar ...

  5. Android开发学习——android存储

    Android的存储 内部存储空间RAM内存:运行内存,相当于电脑的内存ROM内存:存储内存,相当于电脑的硬盘外部存储空间 SD卡:相当于电脑的移动硬盘    * 2.2之前,sd卡路径:sdcard ...

  6. Android应用开发基础之二:数据存储和界面展现(二)

    常见布局 相对布局 RelativeLayout 组件默认左对齐.顶部对齐 设置组件在指定组件的右边 android:layout_toRightOf="@id/tv1" 设置在指 ...

  7. Android学习笔记之JSON数据解析

    转载:Android学习笔记44:JSON数据解析 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种 ...

  8. android 卸载程序、清除数据、停止服务用法

    要实现卸载程序.清除数据.停止正在执行的服务这几大模块,如今将代码粗略总结例如以下: 主要运用到的类有 PackageManager ActivityManager ApplicationInfo R ...

  9. Android实现多次闪退清除数据

    背景 很多时候由于后台返回的数据异常,可能会导致App闪退.而如果这些异常数据被App本地缓存下来,那么即使杀掉进程重新进入还是会发生闪退.唯一的解决方法就是清除App数据,但是用户可能没有这个意识或 ...

随机推荐

  1. vim多行注释与删除

    一.多行注释 1. 首先按esc进入命令行模式下,按下Ctrl + v,进入列(也叫区块)模式;2. 在行首使用上下键选择需要注释的多行;3. 按下键盘(大写)“I”键,进入插入模式:4. 然后输入注 ...

  2. 【webservice】Two classes have the same XML type name(转)

    引言 需要调用另一个系统的提供的webservice接口,但是调用之后总是报错,用SoapUI测试接口却没有问题: 那就应该是代码的问题了,但是同样的代码也调用过其他系统却没有问题,不过最终还是解决了 ...

  3. 蠕虫Worm virus

    美国CORNELL大学研究生莫里斯编写的蠕虫病毒 蠕虫病毒是一种常见的计算机病毒.它是利用网络进行复制和传播,传染途径是通过网络和电子邮件.最初的蠕虫病毒定义是因为在DOS环境下,病毒发作时会在屏幕上 ...

  4. Android WebView的使用(用来显示网页)

    1.WebView介绍 2.URL介绍 简单说就是网址. 3.java后台代码 package com.lucky.test34webview; import android.support.v7.a ...

  5. 004 Android XML文件常用五大页面布局方式

    1.线性布局(LinearLayout)最常用 <1>使用线性布局,首先在xml文件中修改布局为LinearLayout 修改完成后,可在Component Tree中看见如下内容: &l ...

  6. java 加载properties

    /** * 取得属性值,无值时返回默认值 * @param name String 属性名称 * @param defaultValue String 属性名称 * @return String 属性 ...

  7. 关于Manjaro与Ubuntu双系统并存引发的一个boot问题

    事情发生在写下这篇博客的半小时前.笔者的电脑本身是Manjaro+win10双系统并存,因为一些原因要安装ubuntu. 装完ubuntu用了一阵子,想切回manjaro,于是遇到了这个问题. 看到k ...

  8. HTML5本地存储和本地的数据库

    一个网站如何能在客户的浏览器存储更多的数据呢? 在Html4的时代在浏览器端存储点网站个性化的数据,尤其是用户浏览器的痕迹,用户的相关数据等一般只能存储在Cookie中,但是大多是浏览器对于Cooki ...

  9. pandas 多列排序

    import pandas as pd df = pd.DataFrame({'AAA' : [1,2,1,3], 'BBB' : [1,1,2,2], 'CCC' : [2,1,3,1]}) sou ...

  10. 从指定Dictionary中移除指定值项

    void Removeltems(Dictionary<int, ltem> _dicltemMap, ltem _item) { List<ltem> keys=new Li ...