Arhn - архитектура программирования

Как удалить файл, когда приложение закрыто

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

Вот как выглядит мой код до сих пор:

@Override
protected void onDestroy() {

    File file = new File(Environment.getExternalStorageDirectory().getPath(), "fileName.txt");
    if(file.exists()){
        file.delete();
    }

    super.onDestroy();
}

РЕДАКТИРОВАТЬ: попросили показать фрагмент кода, касающийся создания временного файла:

try {
        file = File.createTempFile(Environment.getExternalStorageDirectory().getPath(), fileName);
    } catch (IOException e) {
        e.printStackTrace();
    }
06.04.2016


Ответы:


1

Вы не должны полагаться на вызов метода onDestroy (система может прервать ваш процесс до того, как жизненный цикл достигнет этой стадии). Я бы посоветовал вам использовать временные папки для хранения такого файла, но вы по-прежнему несете ответственность за сохранение размера временных файлов в разумных пределах (~ 1 МБ).


ОБНОВЛЕНИЕ (относительно фрагмента временного файла)

Вы пытаетесь указать полный путь к ExternalStorageDirectory в качестве префикса имени файла. Но этот подход немного отличается. Функция File.createTempFile ничего не делает, кроме создания файла в специальном каталоге временных файлов со случайным именем. Таким образом, мы по-прежнему обязаны предоставить временную папку, чтобы система знала, что этот файл подходит для удаления:

public File getTempFile(Context context, String url) {
    File file;
    try {
        String fileName = Uri.parse(url).getLastPathSegment();
        file = File.createTempFile(fileName, null, context.getCacheDir());
    catch (IOException e) {
        // Error while creating file
    }
    return file;
}

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

06.04.2016
  • временный файл кажется многообещающим, однако я не думаю, что смогу использовать временный файл, поскольку я использую файлы в качестве изображений, сделанных камерой service 07.04.2016
  • Почему вы думаете, что не можете? 07.04.2016
  • Я получал нулевую ошибку исключения, когда служба камеры записывала массив байтов изображения в этот файл, файл действительно был создан как временный файл 07.04.2016
  • Не могли бы вы предоставить свой фрагмент кода, где вы создаете файл? 07.04.2016

  • 2

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

    // get the cache directory for our present `Activity`; 
    // referred to by `context`
    File directory = context.getCacheDir(); 
    
    File file = File.createTempFile("prefix", "extension", directory);
    

    [Документы] Файлы будут закрыты для вашего приложения. , и если на устройстве недостаточно памяти, Android может избавиться от них. Хотя не стоит от этого зависеть.

    Вы можете взглянуть на Android Activity Life-cycle. Итак, если вы отслеживаете файлы, созданные вами в сеансе. Избавьтесь от этих файлов в вашем onDestroy(). Я бы предложил сохранить этот список как SharedPref или что-то в этом роде. Причина? Этот onDestroy() не самая надежная вещь на свете. Если у вас есть сохраненные файлы, вы можете удалить их при следующем вызове onDestroy() (если они все еще существуют).

    Лично я бы, наверное, не стал использовать onDestroy() для этой цели. Возможно, onStop() более надежен. Это ваш дизайн, и вы будете лучшим судьей. :)

    07.04.2016

    3

    Вы можете попробовать использовать приложение . Вы можете переопределить onTerminate(), чтобы удалить свой файл.

    07.04.2016
  • Из документов: This method is for use in emulated process environments. It will never be called on a production Android device, where processes are removed by simply killing them; no user code (including this callback) is executed when doing so. 07.04.2016
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..