应用“关闭”活动

时间:2015-06-16 14:04:32

标签: android

上下文

客户端 - 服务器应用程序,其中服务器是相互关联数据的大图形的提供者。部分图表由客户端按需下载,显示给用户,并存储在本地数据库中,以避免再次请求它们。

图表中的不同类型的节点由不同的活动请求(和显示)。任何时候,任务中都可以出现许多活动,每个活动都显示自己的节点。

有时,图表会发生变化,服务器会向应用提供全新的图表。

为了知道发生这种情况,客户端存储(例如,在共享的首选项中),它熟悉的图形的修订版。请求新数据时,它会告诉服务器此修订版。服务器将其要求的修订与其当前版本进行比较,如果它们不同,则以“图形修订不匹配”而不是数据进行响应。

当客户端收到此类响应时,它会告诉用户图表已更新,并且(重新)使用FLAG_ACTIVITY_CLEAR_TASK启动其根活动,从而有效地“重新启动”应用程序。

问题

我们希望尽可能减少以这种方式强制重启应用的次数。为此,服务器将向客户端发送GCM消息,通知它图表已更改。

问题在于:当客户收到这样的消息时,我们如何知道何时“安全”更新本地存储的修订版?

如果有活动正在运行或“已保存”(在saveInstanceState意义上),那么我们认为更新本地修订版本是“不安全的”,因为它会导致这些活动的状态不一致(在内存中,或保存)以及他们将在新版本下从服务器接收的数据。

解决方案

我们当前的解决方案是在Application.onCreate()中更新本地存储的版本,但如果我们向应用添加长时间运行的服务,则此解决方案不起作用。

我们正在考虑的另一种方法是使用Application.registerActivityLifecycleCallbacks并在未破坏活动的数量变为0时触发更新。但是这种方法存在两个问题:

  • 它没有解决“已保存”(在onSaveInstanceState意义上)活动的问题,因为它们的保存状态可以包含对图形的引用 - 例如,要求它们在Intent中显示的节点的标识符。当它们重新启动时,它们可能会因此崩溃或显示错误的数据。但是,我们至少可以通过将修订版本存储在onSaveInstanceState中来检测此状态,并在重新创建此类活动时将其与当前版本进行比较。
  • 更大的问题:我不确定Android是否会破坏应用任务中的所有活动。如果他们有足够的内存,也许某些版本的Android永远不会这样做。无论哪种方式,我都不认为它会做到这一点,特别是如果应用程序具有长期运行的服务。

0 个答案:

没有答案