2

有我的情况。无论他们在做什么,我都有相同的活动一个接一个地进行。让我们从字母表开始命名它们。当用户使用我的应用程序时,他会通过活动并在它们之间建立自己的路径,因此他可以使用后退按钮返回相应的后退顺序。

他从行动开始。A - D - F 并使用后退按钮,他从 F 回到 D 和 A。好的。现在,当 Android 系统解决应用程序不再使用或在某个特定时间需要大量 RAM 时,系统会将其杀死。我的目标是找到,如何将应用程序恢复到以前的状态,包括打开活动的顺序?

可能不太清楚,所以举个例子:

用户有打开的活动 A(登录) - D - F - G,将其最小化,一段时间后,应用程序被杀死。当他再次启动这个应用程序时,他需要在活动 A 上登录,然后他必须看到活动 G(= 他上次在那里),当他按下后退按钮时,他会去做活动 F,然后是活动 D 等等on... 就像恢复一排活动。我知道我必须保留存储在我的活动(D、F、G)中的所有信息,但是真的可以像这样保留应用程序状态吗?

感谢您对此发表任何评论

解决方案:

我正在跟踪标志,它标识了我的应用程序所处的状态。如果它是 0,则表示我正在正常打开新活动。在每个活动开始时,我将共享首选项字符串放入其中,其中包含我所有的活动历史记录。每个活动都有自己的 id(同样是 sharedPref)。在另一个共享首选项中,当 onPause 发生时,我将其保存为字符串公式数据(或带有 GUI 的数据)。我将标志设置为 1。当应用程序启动且标志为 1 时,我从 sharedPref 恢复应用程序堆栈。从另一个共享首选项为它们中的每一个设置数据。就是这样,应用程序状态恢复了:-)

4

2 回答 2

1

你可以坚持任何你需要的东西,这只是如何以及什么是有益的问题。多年来,有多种技术被用于保持状态。几乎所有这些都可供您使用,但需要您仔细管理。根据您的应用程序的用途,您可能还可以使用一些特殊的技巧。

第1步

确定每个活动需要什么才能有效运行。确定可以重新计算的内容和绝对不应该重新计算的内容。例如,如果您的一个活动是某种类型的游标适配器并根据表的键工作,您不需要持久化整个活动,您只需要保留_id与该特定活动运行相关的任何内容。

第2步

由于您想要跟踪活动历史记录,因此您需要对该历史记录进行一些表示。您提出的是堆栈模型,因此您需要编写自己的堆栈对象并找到一种简单的方法来识别该堆栈中的每个活动。不要尝试保存实际的 Activity 引用,因为这总是会导致泄漏。然后,您可以将此堆栈保存到数据库、共享首选项、文件中,甚至将其打包成一个包。标识每个 Activity 的整数常量可能是实现此目的的一种方法。

第 3 步

确定您的保存方法,并为您的堆栈和每个 Activity 构建适当的保存和加载方法。

第4步

覆盖 Back 按钮以检索堆栈上的顶部 Activity 标识符及其适当的数据。(注意:您的堆栈可能最好放在扩展的Application)然后Activity使用所需的数据开始下一个。

第 5 步

当您的“登录”活动(或应用程序)启动时,加载堆栈。身份验证完成后,重新加载堆栈上的顶部 Activity,并通过 Intent Extras 传递其所需数据。您不必一次打开所有活动,只需打开用户所在的活动即可。

第 6 步 在您的onCreateor onWindowAttachedfor eachActivity中,让它自己添加到堆栈中。在你的onDestroyfor eachActivity中,让它从堆栈中删除。由于您正在持久化数据,因此您可以轻松finish()地表明数据Activity已完成。

第 7 步

在你onPause的每一个Activity拥有它的状态下,你都觉得很重要。您甚至可以保存滚动位置,并在重新启动时Activity重新滚动。在您onCreate拥有它时,它会通过您提供的附加功能恢复其状态。

这真的很简单。如果您需要一些样品,我很乐意提供。

模糊逻辑

于 2011-10-22T18:51:56.963 回答
1

假设您需要做的只是重建从 A 到 Z(或其他)的活动路径,您不需要让事情变得太复杂。如果您想以正确的方式进行操作,请执行 Fuzzical Logic 的建议。如果您想让它快速运行并在此之后使事情复杂化,您可以从这个简单的方法开始。

基本上,您将每个活动映射到一个代码,并维护一个简单的文本文件。每次调用活动时,都应将其代码附加到文本文件中。因此,您实际上只是按照您在问题中解释的内容写入文件。在您的示例中,您将在文本文件中包含“ADFG”。

当您退出活动并返回时,只需阅读文件,切掉最后一个字母,然后写出来。在您的示例中,如果您有“ADFG”,按下回,该文件现在将包含“ADF”。

当您的应用程序启动时,只需读取文件并为每个字符创建关联的活动,就像您通常一样。读取文件一次,并在创建时将字符串传递给每个活动。因此,根活动将读取“A”并启动该活动(在包中传递字符串“DFG”),然后该活动将读取下一个字符并启动 D 活动(传递“FG”),依此类推,直到最后一个活动发现字符串中没有字符。

一旦一切正常,您就可以担心如何存储每个活动的状态信息。Fuzzy 的解决方案是迄今为止最优雅的解决方案,但优雅和 ASAP 通常不会混合在一起,所以这是你的决定。我会将堆栈数据与堆栈中每个项目的状态数据分开。那样IMO更容易。

希望有帮助!

于 2011-10-26T14:41:50.970 回答