Android - Сохранение или удаление файлов, созданных приложением при удалении

StackOverflow https://stackoverflow.com/questions/1222269

Вопрос

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

Это было полезно?

Решение

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

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

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

Другие советы

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

Из самого Документация:

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

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

/Android/data// кэш/ Это имя вашего пакета в стиле Java , например "com.example.android.app".

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

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

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

  • Начиная с Android 6.0 (API 23), Автоматическое резервное копирование для Приложений была введена функция, которая позволяла разработчикам либо разрешать, либо запрещать автоматическое резервное копирование приложений.Начиная с 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

Google Drive - loading= Settings -> Backups">

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

  

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

     

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top