码个蛋(codeegg)第 698 次推文
作者: SpannerBear
原文: https://juejin.im/post/5d2c36f5e51d4556db694aa3
Android/ target=_blank class=infotextkey>安卓碎片化的问题 , 由来已久 , 这次来看一下文件储存碎片化的问题 。到底要怎么去正确选择和管理文件存储呢?为什么要管理文件?
Android手机一直以来被人诟病越用越卡 , 越用存储空间越少 , 经常有要靠各种清理App清理垃圾 , 到最后不得对手机进行双清 , 原因除了硬件老化和Android的底层实现问题之外 , 开发者对文件管理的忽视制造出大量无法清理的“垃圾”也是造成手机卡慢的原因之一 。
Android的开放性给了开发者巨大的自由度 , 但自由不是让我们滥用权限和随意开发的借口 , 每一个开发者都应该注重细节 , 连曾经一片混乱的第三方推送都开始统一整合规范化了 , 如果你还在随意开发 , 不如现在开始 , 注重细节 , 提高用户的Android手机体验?
Android闪存
总所周知 , Android手机存储分为两个部分:内部存储和外部存储 , 内部存储一般是手机自带的存储空间 , 外部存储指外插SD卡提供的存储空间;随着手机发展 , 这两个存储的定义又有了一些些变化 , 新的手机不再有外插SD卡的概念 , 采取了内置闪存(eMMC、UFS等)的方式 , 所以内部存储和外部存储在新的Android手机上已经在同一个硬件上了 。但为了兼容旧设备和让用户得到更好的体验 , 我们仍然需要管理好手机上内外存储的使用 。
关于文件存储位置的api
做过文件相关管理的同学应该都曾经被android众多的文件api搞得一片混乱过 , 现在来理一理.我把应用操作的文件存储位置分为三个部分:
- 应用内部存储私有文件目录
- 应用外部存储私有文件目录
- 公有目录
ContextContext是应用的上下文 , 它用来获取与应用相关的文件目录 , 可以获取应用私有和应用公有目录 , 常用的api有(后面是所对应的路径):
1. Context#getCacheDir /data/user/0/cn.appname.xxx/cache2. Context#getDir("spanner",MODE_PRIVATE) /data/user/0/cn.appname.xxx/app_spanner3. Context#getFileDir /data/user/0/cn.appname.xxx/files3. Context#getExternalCacheDir /storage/emulated/0/Android/data/cn.appname.xxx/cache4. Context#getExternalFilesDir(Environment.DIRECTORY_PICTURES) /storage/emulated/0/Android/data/cn.appname.xxx/files/PicturesContext#getExternalFilesDir /storage/emulated/0/Android/data/cn.appname.xxx/files5. Context#getExternalMediaDirs /storage/emulated/0/Android/media/cn.appname.xxx
前两个是应用内部存储私有目录 , 后面4个都是应用外部存储私有文件目录 。注意:/data/user/0/ 等同于 /data/data/EnvironmentEnvironment和应用无关 , 它用于获取公有存储位置的文件目录 , 常用的api有:
1. Environment#getExternalStorageDirectory /storage/emulated/02. Environment#getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) /storage/emulated/0/DCIMEnvironment#getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) /storage/emulated/0/Pictures3. Environment#getDataDirectory /data4. Environment#getDownloadCacheDirectory /data/cache5. Environment#getRootDirectory /system
API的选用到底什么时候要用什么api呢?
应用私有文件目录应用私有目录由Context获取控制 , 分为内部存储和外部存储 , 内部存储不需要申请文件读写权限也能够使用 , 外部存储需要权限(getetExternalCacheDir 和 getExternalFilesDir 这两个方法从4.4之后不再需要读写权限) 。用户对app进行数据清理或卸载可以清理外部存储和内部存储下的所有文件目录 。
内部存储
内部存储的文件夹其他应用和用户无法直接访问 , 可以用于存放敏感数据 。
- getCacheDir
- 专门用于存放缓存数据 。
- 用户对app进行缓存清理的时候会清理缓存目录cache的数据 , 手机空间不足的时候系统也会对缓存目录内的数据进行清理 。但尽管如此 , 开发者仍要管理好缓存数据特别是内部存储的缓存 , 避免缓存数据过大 。
推荐阅读
- Android中的线程捕获
- OPPO方面确认,Find X2系列将尝鲜Android 11
- Android网络优化篇-从DNS开始
- 总是听到有人说AndroidX,到底什么是AndroidX?
- 不要轻易点击别人给你发的链接,看Kali如何远程控制Android手机
- 手机浮窗怎么去掉
- Android 日常开发总结的技术经验
- Android开发:手把手带你入门跨平台UI开发框架Flutter
- Android程序员如何快乐地学Activity?
- android知识点总结
- 专门用于存放缓存数据 。