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

时间:2009-08-03 13:10:06

标签: android backup uninstall android-lifecycle android-backup-service

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

6 个答案:

答案 0 :(得分:23)

似乎自2009年以来出现了一些发展:)。

来自documentation

  

如果您使用的是API Level 8或   更大,请使用getExternalCacheDir()   打开一个代表该文件的文件   外部存储目录所在的位置   应保存缓存文件。如果是用户   卸载你的应用程序,这些   文件将被自动删除。   但是,在你的生命中   应用程序,你应该管理这些   缓存文件并删除那些文件   为了保存,不需要   文件空间。

     

如果您使用的是API级别7或更低级别,   使用getExternalStorageDirectory()来   打开一个代表root的文件   的外部存储,然后写   您的缓存数据如下   目录:

     

/ Android设备/数据高速缓存// /   这是你的Java风格   包名称,如   “com.example.android.app”。

答案 1 :(得分:12)

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

我认为没有从SD卡中清除任何内容。你可以做一个快速测试并找到它。

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

答案 2 :(得分:4)

即使使用getExternalCacheDir(),我也看到缓存目录(即您的应用程序包名称)未按照Android文档中的说明自动删除,至少在Lenovo 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,你可以在那里做一些清理。

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

答案 3 :(得分:4)

我之所以添加这个,是因为现有答案在2017年已经过时。 尽管app卸载没有回调,但已经提供了一些机制来保存除卸载之外的应用数据。

  • 自Android 6.0(API 23)以来,Auto Backup for Apps 引入了一项功能,允许开发人员允许或阻止自动应用程序备份。从API 23开始,默认情况下启用备份。

  • 为清单文件引入了两个新的application代码:android:allowBackupandroid:fullBackupContent

要退出自动备份,请将android:allowBackup="false"添加到application标记下的清单文件中。值" true"将自动将共享首选项和数据库保存到云端,以及other files

其次,您可以非常具体地了解要删除的文件 包含 排除 使用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云端硬盘。如果用户启用了以下设置,则会在重新安装时恢复数据

Settings -> Backup & Reset -> Automatic Restore

还应注意,用户或设备上的其他应用程序无法读取备份数据。

enter image description here

也可以从Google Drive应用中访问相同内容:

Google Drive -> Settings -> Auto backup for apps -> Backup and reset

enter image description here

值得注意的是,如果将相同的主要 Google帐户用于多个设备,则会创建多个设备备份。可以从此处访问各个设备的备份:

Google Drive -> Settings -> Backups

Google Drive -> Settings -> Backups

答案 4 :(得分:3)

从那时起,似乎有一个适当的解决方案,Context.getExternalFilesDir()

  

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

     

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

答案 5 :(得分:0)

如果要存储大数据,则将其存储在具有文件路径名的外部存储中,例如

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

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