26

我创建了一个应用程序,它创建文件并将其存储到 sdcard。有没有办法将文件夹与应用程序绑定,以便在用户在 android 设备上运行卸载时删除所有文件?

4

6 回答 6

23

自 2009 年以来似乎有一些发展:)。

文档中:

如果您使用 API 级别 8 或更高版本,请使用getExternalCacheDir()打开一个文件,该文件代表您应该保存缓存文件的外部存储目录。如果用户卸载您的应用程序,这些文件将被自动删除。但是,在应用程序的生命周期中,您应该管理这些缓存文件并删除那些不需要的以保留文件空间。

如果您使用 API Level 7 或更低版本,请使用getExternalStorageDirectory()打开代表外部存储根目录的文件,然后将缓存数据写入以下目录:

/Android/data//cache/ 是你的Java风格的包名,比如“com.example.android.app”。

于 2011-06-17T08:28:41.087 回答
13

您的应用程序无法知道它正在被卸载(无需修改内核)。data/data/your.app.package应用程序卸载时会自动删除其中创建的所有文件。

我认为没有从 sdcard 中清除任何内容。您可以进行快速测试并找出答案。

另一种方法可能是让另一个应用程序检查该应用程序是否已安装。如果没有,它可以进行清理工作。

于 2009-08-03T16:27:55.533 回答
8

我之所以添加这个,是因为现有答案在 2017 年已经过时。虽然应用程序卸载确实没有回调,但已经提供了一些机制来保留卸载后的应用程序数据。

  • 从 Android 6.0 (API 23) 开始,引入了应用程序自动备份 功能,允许开发人员允许或阻止自动应用程序备份。自 API 23 起,备份默认启用。

  • application清单文件引入了两个新标签:android:allowBackupandroid: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

Google 云端硬盘 -> 设置 -> 备份

于 2017-02-01T12:25:18.177 回答
4

即使在使用 时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(...) 将是真的,你可以在那里做一些清理工作。

我知道这并不能直接回答问题,并且将未使用的数据留在用户的设备上并不好,但我认为这可能是在删除应用程序时尝试清理的替代方法,这是明智的,但似乎是不可能的。

于 2012-09-06T13:46:40.377 回答
3

从那以后似乎有一个合适的解决方案,Context.getExternalFilesDir()

返回外部文件系统上目录的绝对路径(即 Environment.getExternalStorageDirectory() 上的某个位置),应用程序可以在其中放置它拥有的持久文件。这些文件对于应用程序是私有的,并且通常不作为媒体对用户可见。

这就像 getFilesDir() 一样,在卸载应用程序时这些文件将被删除

于 2013-02-23T12:11:09.843 回答
0

如果要存储大数据,请将其存储在外部存储中,并使用文件路径名,例如

Environment.getExternalStorageDirectory().toString()+"/Android/data/packageName"

其中包名称是您的应用程序包名称,例如 com.think.abc

于 2012-03-21T11:07:35.863 回答