2016-04-06 2 views
0

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

Вот что мой код выглядит так далеко:

@Override 
protected void onDestroy() { 

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

    super.onDestroy(); 
} 

EDIT: В ответ на просьбу показать фрагмент кода относительно создания временного файла:

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

https://docs.oracle.com/javase/7/docs/api/java/io/File.html#deleteOnExit%28%29 – Kenney

+0

В Java вы можете создать временный файл: http: // stackoverflow.com/a/16691560/4065876. Я не знаю, работает ли в Android. –

+0

@ Kenney, я заменил метод 'delete()' на 'deleteOnExit()', но это не сработало. –

ответ

1

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

UPDATE (по отношению к темп-файлу snippet)
@EbadSaghar, вы пытаетесь предоставить полный путь к ExternalStorageDirectory в качестве префикса имени файла. Но в любом случае подход немного отличается: функция File.createTempFile ничего не делает, кроме создания файла в специальном каталоге temp-файлов с использованием случайного имени. Таким образом, до сих пор в нашей ответственности, чтобы обеспечить ТЕМП-папку для функции, чтобы система знала, что этот файл подходит для удаления:

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 вашего временного файла.

+0

Временный файл кажется многообещающим, однако я не думаю, что могу использовать временный файл, так как я использую файлы в качестве снимков, сделанных камерой 'service' –

+0

Почему вы думаете, что не можете? –

+0

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

0

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

+1

Из [docs] (http://developer.android.com/reference/android/app/Application.html#onTerminate()): 'Этот метод предназначен для использования в среде с эмулированными процессами. Он никогда не будет вызываться на производственном устройстве Android, где процессы удаляются, просто убивая их; при этом не выполняется код пользователя (включая этот обратный вызов). –

+0

Да. Правильно. Спасибо за исправление! –

0

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

// get the cache directory for our present `Activity`; 
// referred to by `context` 
File directory = context.getCacheDir(); 

File file = File.createTempFile("prefix", "extension", directory); 

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

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

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

Смежные вопросы