Android:强制状态杀死了应用程序

时间:2014-05-12 13:34:40

标签: android memory service lifecycle kill

据我所知,Android可能会随时终止我的流程1

有人可能会解释文章[1],以至于在任何时候,一个过程必须能够在崩溃中存活下来。怎么处理?如果以这种方式杀死进程,是否可以保证调用任何方法?文章*没有提到它。

我的问题是,你如何保证在下次开始时以某种理智的方式恢复强制杀戮的过程?我的进程唯一的状态(假设在处理被杀死时没有保证被调用的方法)是持久存储(DB或其他地方)中的状态,如果进程被强制终止,这可能是不完整的。

具体示例:假设我要求服务部门执行某些工作。这项工作不像播放音乐文件。这项工作可以在某些时候被视为“完成”(例如,将数据发送到网络)。如果我的服务被杀,比如50%的工作完成后,我的应用程序如何知道工作是否成功?我可以在持久存储中使用一个标记“完成”,但即便如此,在我发送最后一个字节之后和设置标志之前,Android可能会终止我的服务。

有没有常见的处理方法?重新启动时,我的服务可以与Web服务器协商以查看文件是否已传输,但很快就会变得非常复杂,我认为它不会真正解决问题。

[编辑1开始]

我知道以下文本[1],但这并没有解决服务问题,“每次用户离开应用程序的那一部分时都会生成最后一个状态,而不是在它被杀死时”

[编辑1结束]

[编辑2开始]

我发现了一些非常有趣的东西。 Android文档中与此相关的明显不一致。请在2

查看我的新问题

[编辑2结束]

[编辑3开始]

“明显不一致”已经解决。这是由于我对“app”/“process”/“activity”术语不准确。不过,这个问题仍然存在。

[编辑3结束]

1 个答案:

答案 0 :(得分:3)

  

如果以这种方式杀死进程,是否有任何方法可以保证?

当您的流程终止时,您的应用程序不会调用任何内容。

  

你如何保证在下次开始时以某种理智的方式恢复强制杀戮过程?

这不能抽象地回答。

  

我的进程所拥有的唯一状态(假设对进程被终止时调用的方法没有保证)是持久存储(DB或其他地方)中的状态,如果进程被强制终止,则可能不完整。

您应该在数据更改时更新本地持久性存储。因此,当您的流程终止时,您的持久存储可能是最新的。应将内存缓存视为读缓存,而不是写缓存。

  

这是可以考虑的工作"完成"在某些时候(例如将数据发送到网络)。如果我的服务被杀,比如50%的工作完成后,我的应用程序将如何知道工作是否成功?

它必须与Web服务器协商以确定哪些内容已成功上载。

  

有没有什么常用的处理方式?

有多种方法可以尝试维护"事务完整性",特别是对于长期运行的操作,其中进程终止会带来更大的问题。这些都不是Android的独特之处,因为这在计算机中已经存在数十年的问题。大多数归结为"检查成功的内容,然后重新尝试没有做到的事情"。这有多复杂取决于您尝试更新的数据的性质以及更新它的可用方法。