如何在android中退出app时删除createTempFile创建的所有临时文件?

时间:2017-02-26 03:02:50

标签: java android

我使用以下代码创建一些临时文件,并将tem包装为inputteam以发送到客户端。

据我所知,当磁盘空间不足时,android系统可以自动删除临时文件。

但我希望在退出应用程序时可以自行删除临时文件,我该怎么办?谢谢!

代码

File outputDir = context.getCacheDir(); // context being the Activity pointer
File outputFile = File.createTempFile("prefix", "extension", outputDir);

6 个答案:

答案 0 :(得分:5)

调用deleteOnExit()方法!

在您活动的onStop()中调用delete()方法。

修改

如果您在onDestroy()中调用delete()以确保您的代码能够正常工作,即使系统销毁了应用,也可能会更好。

答案 1 :(得分:5)

如果onDestroyisChangingConfigurations()falseisFinishing,请删除true中的文件。例如:

@Override protected void onDestroy() {
  super.onDestroy();
  if(!isChangingConfigurations()) {
    deleteTempFiles(getCacheDir());
  }
}

private boolean deleteTempFiles(File file) {
  if (file.isDirectory()) {
    File[] files = file.listFiles();
    if (files != null) {
      for (File f : files) {
        if (f.isDirectory()) {
          deleteTempFiles(f);
        } else {
          f.delete();
        }
      }
    }
  }
  return file.delete();
}

答案 2 :(得分:0)

首先,请记住"退出"对于Android应用程序意味着与桌面应用程序非常不同的东西。有关详细信息,请参阅this article,但简短的回答是,一般情况下,当操作系统实际关闭您的应用时,您不知道(即使它不可见)。事实上,没有明确保证操作系统会完全关闭它。

可以在这里找到一些想法(它的C#/ Xamarin.Android,但Java的确切想法):How to detect application exit on android?

除了那里列出的东西外,您还可以尝试在手机关机时注册广播接收器。

另一种(更糟糕的是,在我看来)方式是在应用程序不再可见时(在onStop中)执行此操作。但是,如上所述,这与实际关闭的程序不同(因为您不知道 - 或者即使 - 操作系统实际上会关闭应用程序)。

答案 3 :(得分:0)

如果您可以为您创建的所有文件维护Set(避免重复),那会更好。

迭代文件列表并逐个删除每个文件。

 public static final Set<String> TMP_FILES = new HashSet<>();

并通过迭代删除所有。

public void deleteTempFiles() {
  for(String myTempFile: TMP_FILES) {
    try {
      new File(myTempFile).delete();
    } catch (Exception e) {
      // Handle if needed.
    }
  }
}

答案 4 :(得分:0)

不幸的是,您似乎必须逐个删除这些文件,方法是先将它们保存在一个数组中。

话虽如此,如果你在这个问题上检查Android开发者page,它就会使你好像可以定期删除缓存的文件&#34;并定期删除你不再需要的其他文件&# 34 ;.但是我不认为有关于如何做的解释。

答案 5 :(得分:0)

我最终在这里寻找一种方法来删除我为相机意图而创建的临时文件,实际上我使用了 Sridhar的答案和{{3 }}

我正在使用cleanOldFiles创建一个新的图像文件,然后将其添加到

createTempFile

要使用普通的foreach循环迭代并从集合中删除,请抛出public static final HashSet<File> TEMP_FILES = new HashSet<>();,因此我使用java.util.ConcurrentModificationException

更新了循环

this answer

在其他人发给我的帮助下,多亏了Sridhar和ggrandes,我想发布它,以帮助其他人。

Iterator

该功能删除以秒为单位的给定时间值之前的文件,其调用方式为

public synchronized void cleanTempFiles(final int secondsOld) {
    long now = (System.currentTimeMillis() / 1000);
    for (Iterator<File> iterator = TEMP_FILES.iterator(); iterator.hasNext(); ) {
        File f = iterator.next();
        long expired = (f.lastModified() / 1000) + secondsOld;
        if (now >= expired) {
            Log.d(TAG, "Deleted file - \"" + f.getAbsolutePath() +"\"");
            f.delete();
            iterator.remove();
        }
    }
}