Android - сохранить или удалить файлы, созданные приложением при удалении - PullRequest
24 голосов
/ 03 августа 2009

Я создал приложение, которое создает и сохраняет файлы на SDCard.Есть ли способ связать папку с приложением, чтобы удалить все файлы, когда пользователь запускает деинсталляцию на устройстве Android?

Ответы [ 6 ]

23 голосов
/ 17 июня 2011

Похоже, что с 2009 года произошли некоторые события :)

Из документации :

Если вы используете API уровня 8 или больше, используйте getExternalCacheDir() для открыть файл, который представляет каталог внешнего хранилища, где вы следует сохранить файлы кэша. Если пользователь удаляет ваше приложение, эти файлы будут автоматически удалены. Тем не менее, в течение жизни вашего приложение, вы должны управлять этим кэшировать файлы и удалять те, которые не нужны для того, чтобы сохранить файловое пространство.

Если вы используете API уровня 7 или ниже, используйте getExternalStorageDirectory() для открыть файл, который представляет корень из внешнего хранилища, затем напишите ваши данные кэша в следующем Каталог:

/ Android / данные // кэш / Это ваш стиль Java имя пакета, например "Com.example.android.app".

12 голосов
/ 03 августа 2009

У вашего приложения нет возможности узнать, что оно удаляется (без изменения ядра). Все файлы, созданные в data/data/your.app.package, удаляются автоматически при удалении приложения.

Я не думаю, что что-то очищено от SDCard. Вы можете сделать быстрый тест и выяснить это.

Другим подходом может быть другое приложение, которое проверяет, установлено ли это приложение или нет. Если нет, он может выполнить работу по очистке.

4 голосов
/ 01 февраля 2017

Я добавляю это, потому что существующие ответы устарели в 2017 году. Несмотря на то, что при удалении приложения обратного вызова не происходит, были предоставлены некоторые механизмы для сохранения данных приложения после удаления.

  • Начиная с Android 6.0 (API 23), Автозагрузка для Apps была введена функция, которая позволяла разработчикам разрешать или запрещать автоматическое резервное копирование приложений. Начиная с API 23 резервное копирование включено по умолчанию.

  • Для файла манифеста введены два новых тега application: android:allowBackup и android:fullBackupContent.

Чтобы отказаться от автоматического резервного копирования, добавьте android:allowBackup="false" в файл манифеста под тегом application. Значение «true» автоматически сохраняет общие настройки и базы данных в облаке, а также другие файлы .

Во-вторых, вы можете очень точно указать файлы, которые вы хотите включить или исключить для удаления или сохранения при удалении с тег android:fullBackupContent. Этот атрибут указывает на файл XML, который содержит правила резервного копирования. Создайте файл конфигурации XML в каталоге res/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

image Settings -> Backups">

4 голосов
/ 06 сентября 2012

Даже при использовании 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 (...) будет верным, и вы можете выполнить некоторую очистку там.

Я знаю, что это не дает прямого ответа на вопрос, и нехорошо оставлять неиспользуемые данные на устройствах пользователей, но я думаю, что это может быть альтернативой попыткам очистки при удалении приложения, что разумно, но кажется невозможным.

3 голосов
/ 23 февраля 2013

кажется, с тех пор существует правильное решение, Context.getExternalFilesDir () :

Возвращает абсолютный путь к каталогу во внешней файловой системе. (это где-то в Environment.getExternalStorageDirectory ()) где приложение может размещать постоянные файлы, которыми оно владеет. Эти файлы закрытый для приложений, и обычно не видимый пользователю как СМИ.

Это похоже на getFilesDir () в том, что эти файлы будут удалены при приложение удалено

0 голосов
/ 21 марта 2012

, если вы хотите сохранить большие данные, сохраните их во внешнем хранилище с именем файла, например

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

где имя пакета - это имя пакета вашего приложения, например com.think.abc

...