我创建了一个应用程序,它创建文件并将其存储到 sdcard。有没有办法将文件夹与应用程序绑定,以便在用户在 android 设备上运行卸载时删除所有文件?
6 回答
自 2009 年以来似乎有一些发展:)。
从文档中:
如果您使用 API 级别 8 或更高版本,请使用
getExternalCacheDir()
打开一个文件,该文件代表您应该保存缓存文件的外部存储目录。如果用户卸载您的应用程序,这些文件将被自动删除。但是,在应用程序的生命周期中,您应该管理这些缓存文件并删除那些不需要的以保留文件空间。如果您使用 API Level 7 或更低版本,请使用
getExternalStorageDirectory()
打开代表外部存储根目录的文件,然后将缓存数据写入以下目录:/Android/data//cache/ 是你的Java风格的包名,比如“com.example.android.app”。
您的应用程序无法知道它正在被卸载(无需修改内核)。data/data/your.app.package
应用程序卸载时会自动删除其中创建的所有文件。
我认为没有从 sdcard 中清除任何内容。您可以进行快速测试并找出答案。
另一种方法可能是让另一个应用程序检查该应用程序是否已安装。如果没有,它可以进行清理工作。
我之所以添加这个,是因为现有答案在 2017 年已经过时。虽然应用程序卸载确实没有回调,但已经提供了一些机制来保留卸载后的应用程序数据。
从 Android 6.0 (API 23) 开始,引入了应用程序自动备份 功能,允许开发人员允许或阻止自动应用程序备份。自 API 23 起,备份默认启用。
application
清单文件引入了两个新标签:android:allowBackup
和android:fullBackupContent
.
要选择退出自动备份,请添加android:allowBackup="false"
到application
标记下的清单文件中。“true”值将自动将共享首选项和数据库以及其他文件保存到云中。
其次,您可以非常具体地使用标签在卸载时包含或排除要删除或保留的文件。android:fullBackupContent
此属性指向包含备份规则的 XML 文件。res/xml/
使用以下语法在目录中创建 XML 配置文件:
<full-backup-content>
<include domain=["file" | "database" | "sharedpref" | "external" | "root"]
path="string" />
<exclude domain=["file" | "database" | "sharedpref" | "external" | "root"]
path="string" />
</full-backup-content>
您可以在此处添加要包含或排除的特定文件类型及其关联路径。将标签添加到android:fullBackupContent = "@xml/my_backup_rules"
标签下的清单文件中application
。
指定的文件将备份到设备主电子邮件帐户下的 Google Drive。如果用户启用了以下设置,则数据将在重新安装时恢复:
Settings -> Backup & Reset -> Automatic Restore
.
还应注意,用户或设备上的其他应用程序无法读取备份数据。
也可以从此处的 Google Drive 应用程序访问相同的内容:
Google Drive -> Settings -> Auto backup for apps -> Backup and reset
值得注意的是,如果多个设备使用同一个主Google 帐户,则会创建多个设备备份。可以从这里访问单个设备的备份:
Google Drive -> Settings -> Backups
即使在使用 时getExternalCacheDir()
,我也看到缓存目录(即您的应用程序包名称)并没有像 Android 文档中所说的那样自动删除,至少在联想 A1 上没有。这可能有点幼稚,但您可能希望在重新安装期间清理以前的数据。在那里,您可以查看您的应用程序是否已卸载或首次安装 - 您使用共享首选项存储一个值,可能是布尔值。它可以是这样的:
SharedPreferences sharedPrefs = getSharedPreferences(INSTALL_PREFS, MODE_PRIVATE);
if(sharedPrefs.getBoolean("AppInstalled", false) == false){
//DELETE APP DIRECTORY
SharedPreferences.Editor editor = sharedPrefs.edit();
editor.putBoolean("AppInstalled", true);
editor.commit();
}
这样,每次应用程序运行时,它都会检查它是否是第一次运行。当应用程序被删除时,应用程序的共享首选项也将被删除。然后,下次安装它时, if(...) 将是真的,你可以在那里做一些清理工作。
我知道这并不能直接回答问题,并且将未使用的数据留在用户的设备上并不好,但我认为这可能是在删除应用程序时尝试清理的替代方法,这是明智的,但似乎是不可能的。
从那以后似乎有一个合适的解决方案,Context.getExternalFilesDir():
返回外部文件系统上目录的绝对路径(即 Environment.getExternalStorageDirectory() 上的某个位置),应用程序可以在其中放置它拥有的持久文件。这些文件对于应用程序是私有的,并且通常不作为媒体对用户可见。
这就像 getFilesDir() 一样,在卸载应用程序时这些文件将被删除
如果要存储大数据,请将其存储在外部存储中,并使用文件路径名,例如
Environment.getExternalStorageDirectory().toString()+"/Android/data/packageName"
其中包名称是您的应用程序包名称,例如 com.think.abc