Android - 保留或删除应用程序在卸载时创建的文件

26

我创建了一个应用程序,它可以在SD卡上创建和存储文件。有没有一种方法可以将该文件夹与应用程序绑定,以便在用户在Android设备上运行卸载时删除所有文件?


应用程序NQ Mobile Security正在调用卸载时的Activity,请查看http://i.imgur.com/Fos9N.png,http://i.imgur.com/fIZbK.png,http://i.imgur.com/cG9Hr.png和问题https://dev59.com/JWkv5IYBdhLWcg3w91lG。 - Gaurav Agarwal
6个回答

23

看起来自2009年以来有一些进展 :).

根据文档

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

如果您正在使用API级别7或更低版本,请使用getExternalStorageDirectory()打开代表外部存储根目录的File,然后在以下目录中写入缓存数据:

/Android/data/包名/cache/ 其中“包名”是您的Java风格的包名,例如“com.example.android.app”。


你好,我正在尝试找到一种方法,在应用程序被卸载时保存这个文件。谢谢。 - famfamfam

13

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

我认为sdcard中不会清除任何东西。您可以进行快速测试并找出答案。

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


应用程序NQ Mobile Security正在调用卸载时的Activity,请查看http://i.imgur.com/Fos9N.png,http://i.imgur.com/fIZbK.png,http://i.imgur.com/cG9Hr.png和问题https://dev59.com/JWkv5IYBdhLWcg3w91lG。 - Gaurav Agarwal
对于编译为Android 6.0或更高版本并启用云备份的应用程序,请参阅Y.S.的答案。 - dermatthias
你好,我正在尝试找到一种方法,在应用卸载时保存此文件。谢谢。 - famfamfam

8

我添加这个信息是因为现有的答案在2017年已经过时。虽然卸载应用程序时没有回调,但是一些机制已经提供了超出卸载范畴的应用数据保存方式。

  • 自Android 6.0(API 23)以来,应用自动备份功能被引入,允许开发人员允许或阻止自动应用备份。从API 23开始备份处于启用状态。

  • 新增了两个application标记,用于清单文件:android:allowBackupandroid:fullBackupContent

要退出自动备份,请在application标记下添加android:allowBackup="false"到清单文件中。值为“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”标签添加到应用程序标记下的清单文件中。
指定的文件将备份到设备的主电子邮件帐户下的Google Drive中。只要用户启用了以下设置,数据就会在重新安装时进行恢复:
设置->备份和重置->自动还原。
还应注意,备份数据无法由用户或设备上的其他应用程序读取。

enter image description here

同样也可以从Google Drive应用程序访问此功能:

Google Drive -> 设置 -> 应用自动备份 -> 备份和重置

enter image description here

值得注意的是,如果同一 主要 Google 账户用于多个设备,则会创建多个设备备份。可以从以下位置访问各个设备的备份:

Google Drive -> 设置 -> 备份

Google Drive -> Settings -> Backups


1
很棒的答案。我正是在寻找这个答案。在2017年(或自Android 6.0以来),这就是正确的答案。 - dermatthias
1
@Y.S. 完美的答案 :D - Skizo-ozᴉʞS ツ
WhatsApp备份是如何工作的?它们有单独的备份,而不是手机备份吗?你有什么想法? - Emil
WhatsApp 也使用 Google Drive 来在多个设备上进行自动恢复。 - Yash Sampat

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(...) 将为true ,您可以在那里进行一些清理。
我知道这并没有直接回答问题,而且在用户设备上留下未使用的数据并不好,但我认为这可能是尝试在应用程序被删除时进行清理的替代方法,这是明智的,但似乎是不可能的。

我不知道是否误解了,但是似乎如果你从第一个应用程序发布开始使用它,它将按预期工作,你同意吗? - Victor Laerte

3

看起来从那时起就有了一个适当的解决方案,Context.getExternalFilesDir():

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

这类似于getFilesDir(),因为这些文件将在卸载应用程序时被删除。


0
如果您想存储大量数据,则应将其存储在外部存储器中,并使用文件路径名称进行存储。
Environment.getExternalStorageDirectory().toString()+"/Android/data/packageName"

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接