type
status
date
slug
summary
tags
category
icon
password

存储数据的几种方式

  • 应用专属存储空间
    • 应用专属空间里的数据会在应用被卸载的时候删除,清除缓存通常指的是清除缓存文件下的文件,清空数据则是清空所有cache,files下文件,如果想让其他APP可以访问这些私有数据,可以利用FileProvider。
    • 内部存储
      • 大多是通过Context获取的地址,一般在/data/data文件夹下,如
      • dataDir: /data/data/packagename
      • filesDir: /data/data/packagename/files
      • cacheDir: /data/data/packagename/cache
      • codeCacheDir:/data/data/packagename/code_cache
    • 外部存储
      • 可以通过Context获取,也可以通过Environment获取,一般在/storage/emulated/0/Android/data/pacakagename/,如:
      • externalCacheDir:/storage/emulated/0/Android/data/pacakagename/cache
      • getExternalFilesDir:/storage/emulated/0/Android/data/pacakagename/files
      • externalMediaDirs
    • SharedPreference
    • 本地数据库
  • 共享的存储空间
    • 可以被其他APP访问的数据,app卸载不会被删除,通常位于/storage/emulated/0下(除了/storage/emulated/0/Android/data/pacakagename)。
    • media files
      • 可以通过 MediaStore处理
    • 文档和其他文件
      • 可以通过ContentResolver和其他相关方法处理

几个容易混淆的地方

/data/data vs /data/user/0

/Android/data vs /Android/user/0

现在的手机操作系统多是支持多用户的,最常见的就是“访客模式”,通常情况下,/data/data 与 /data/user/0是等价的,对于不同的用户,实际的存储位置可能是/user/xxx,但是我们通常只需要访问/data/data即可。

/mnt/sdcard vs /sdcard vs /storage/sdcard0

这个其实就是“软链接”的区别,可以通过 ls -l命令查看:
storage/sdcard0 -> /sdcard mnt/sdcard -> /storage/self/primary sdcard -> /storage/self/primary
可以看到这几个地址的真实地址实际上都是/storage/self/primary。

/storage/emulated/0

共享的存储空间的根目录,其中0代表的是主存,如果有移动的存储空间,如外接SD卡,则会有其他数字。
可通过下列方法获取:
Environment.getExternalStorageDirectory()
在Android Q之后,这个方法标记废弃,可以使用
Context#getExternalFilesDir(String)
或者MediaStoreIntent#ACTION_OPEN_DOCUMENT等方法作为替代。
该目录下在没有被app污染时,通常有以下这些子目录:
Alarms Android DCIM Download Movies Music Notifications Pictures Podcasts Ringtones
对于具体的子目录,可以通过以下方法获取:
Environment.getExternalStoragePublicDirectory
Android Q之后,可用上面说的Context#getExternalFilesDir(String)MediaStoreIntent#ACTION_OPEN_DOCUMENT替代。
Android中的ANativeWindowAndroid系统启动流程分析
姜康
姜康
一个软件工程师
公告
type
status
date
slug
summary
tags
category
icon
password
🎉博客网站重新制作了🎉
👏欢迎更新体验👏