2013-11-09 33 views
2

我正在开发一个小应用程序,您可以在其中发送带有文件附件的电子邮件。发送电子邮件时,文件必须被删除。我使用startActivityForResult(emailIntent)开始电子邮件意向,并在onActivityResult()中收到响应。问题在于,在我按下电子邮件客户端中的发送按钮之后立即调用onActionResult(),而不是在实际发送电子邮件时调用。我还读了ACTION_SEND不是为你设计的startActivityForResult()。所以问题是何时/如何删除文件?我在想我可以运行一个Thread,它将检查该文件是否未被任何其他进程使用,然后将其删除。问题可能在于应用程序被销毁,线程被销毁并且文件永远不会被删除。那么运行某种Service的文件会等到文件可以被删除然后自行终止。 什么是最好的解决方案?如何删除文件

+0

deleteOnExit() - 安排此文件在VM正常终止时自动删除。那么当文件实际上应该被删除? 请注意,在Android上,应用程序生命周期不包括VM终止,因此调用此方法不会确保删除文件。 – Husky

回答

1

发送邮件时,文件必须被删除。

这是不可能的,因为您无法知道文件何时发送。

我使用startActivityForResult(emailIntent)启动电子邮件意图,并在onActivityResult()中捕获响应。

ACTION_SEND不是设计用于startActivityForResult(),即使是这样,也不能保证,当onActivityResult()被称为该电子邮件真正发送。您无法知道电子邮件是否已发送。例如,电子邮件客户端可能已经简单地排队要发送的电子邮件,因为没有互联网连接,或者电子邮件的设置被设置为使得它批量发送电子邮件或其它。

所以问题是何时/如何删除文件?

等24小时,然后删除它,并希望电子邮件在这段时间内发送。

我在想我可以运行一个线程,它将检查该文件是否未被任何其他进程使用,然后将其删除。

您正在假设其他应用程序的实现。没有要求第三方电子邮件应用程序必须让您的文件在您碰巧认为应该打开时打开。

那么如何运行某种服务,将等到文件可以删除,然后自杀。

同样,您无法真正知道文件何时可以删除。 24小时是猜测;可以想象,电子邮件可能仍在排队,而另一个应用可能仍然需要附件。但是,基于时间的策略是您可以进行的最不有效的假设,并且还可以让用户更容易地配置多长时间让文件在删除之前徘徊。

+0

是的,你是对的。但让我们假设该文件是从自定义相机拍摄的照片,其唯一目的是“活着”直到它被发送并根据要求,它必须被删除。正如你所说的,唯一的选择看起来很方便,就是在24小时后删除文件,并希望它已发送。如果在24小时内打开手机,该怎么办?我猜这封电子邮件已从队列中删除,并且永远不会再发送,但图像仍然存在。 – Husky

+0

@赫斯基:“如果手机在24小时内转过来,会怎么样?我猜这封电子邮件已经从队列中删除了,永远不会再发送,但图像仍然存在” - 由于手机关机,没有人应该在乎,而且无论如何你都无能为力,因为手机关机了,你的代码无法运行。欢迎您使用'AlarmManager'来触发删除过程,并且欢迎您检查在启动时要删除的文件(以涵盖“关闭”场景)。 – CommonsWare

+0

@赫斯基:此外,您的“要求”可能会决定您不能使用'startActivity()'发送电子邮件。相反,您需要将文件上传到您的服务器并从那里发送,否则您将需要使用JavaMail(或同等产品)直接发送它。 “ACTION_SEND”和“ACTION_SENDTO”用于更偶然的使用,可能不一定满足所有“要求”。 – CommonsWare