Android 应用目录分析

转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/119650111
本文出自【赵彦军的博客】

沙箱私有目录

  • 内部存储空间中的应用私有目录
val filesDir = filesDir
/data/user/0/com.example.myapplication/files

val cacheDir = cacheDir
/data/user/0/com.example.myapplication/cache

app 的私有目录,也称沙箱。App 卸载后,此目录随之删除。文件管理器无法访问,除非root。还有一种方法,把手机连到到电脑上,运行 app debug 模式,用 AndroidStudio 工具是可以看到的。

cacheDir:机身内存不足时,文件会被删除

在这里插入图片描述

需要注意的是,appSharedPreferencesSQLiteDatabase 持久化应用相关数据也在这个目录的父目录。

SharedPreferences/data/user/0/app_package_name/shared_prefs
SQLiteDatabase:       /data/user/0/app_package_name/databases

Context 提供了一个简便方式,来获取一个内部私有目录

//获取一个私有目录,如果没有,系统自动创建
val dir = getDir("myFile", Context.MODE_PRIVATE)
/data/user/0/app_package_name/myFile
  • mode 是指文件夹的访问权限而并不包括其子文件夹和文件的访问权限:
  • MODE_PRIVATE :该文件只能被当前程序读写;
  • MODE_APPEND : 以追加方式打开该文件,应用程序可以向该文件中追加内容。
  • MODE_WORLD_READABLE :该文件的内容可以 被其他程序读取。
  • MODE_WORLD_WRITEABLE :该文件的内容可以 被其他程序读取、写入。

外部存储空间中的应用私有目录

val externalCacheDir = externalCacheDir?.absolutePath
/storage/emulated/0/Android/data/app_package_name/cache

val filesDir = getExternalFilesDir(null)  //null 代表根目录
/storage/emulated/0/Android/data/app_package_name/files

这个目录,是沙箱目录,App 卸载后,此目录随之删除 ,这个目录可以通过文件管理器访问。有一点是特别需要注意的,这个目录存储在 SD 卡上,如果用户把 SD 卡卸载了,那么这个目录将不可用。

内部私有目录、外部私有目录 均不需要申请权限。

值得注意的是,与内部存储空间的应用私有目录不同的是:

  • 第一,默认情况下,系统并不会自动创建外部存储空间的应用私有目录。只有在应用需要的时候,开发人员通过 SDK 提供的 API 创建该目录文件夹和操作文件夹内容。
  • 第二,自 Android 7.0 开始,系统对应用私有目录的访问权限进一步限制。其他 App 无法通过 file:// 这种形式的 Uri 直接读写该目录下的文件内容,而是通过 FileProvider 访问。
  • 第三,宿主 App 可以直接读写内部存储空间中的应用私有目录;而在 4.4 版本开始,宿主 App 才可以直接读写外部存储空间中的应用私有目录,使开发人员无需在 Manifest 文件中或者动态申请外部存储空间的文件读写权限。
  • 而相同点在于:同属于应用私有目录,当用户卸载 App 时,系统也会自动删除外部存储空间下的对应 App 私有目录文件夹及其内容。
//判断SD卡是否可用:
val state = EnvironmentCompat.getStorageState(file)
if (state == Environment.MEDIA_MOUNTED) {
    //sd卡可用
}

外部存储公有目录

val dataDir = Environment.getDataDirectory().absolutePath
/data

val storageDir = Environment.getStorageDirectory().absolutePath
/storage

需要注意的是:这两个目录需要权限声明 , 在 6.0 及以上还需要动态申请权限

如果没有权限,app 会崩溃

//动态申请权限:
ActivityCompat.requestPermissions(
    this,
    arrayOf(
        Manifest.permission.WRITE_EXTERNAL_STORAGE,
        Manifest.permission.READ_EXTERNAL_STORAGE
    ),
    200
)

清除缓存 、清除数据有什么区别?

app里面有清除缓存,清除数据,但是这两个有什么区别呢?
在这里插入图片描述

  • 清除数据 = 清除内部存储空间 cache + 清除内部存储空间 files + 清除外部存储空间 cache + 清除外部存储空间 files
  • 清除缓存 = 清除内部存储空间 cache + 清除外部存储空间 cache
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值