有我的情况。无论他们在做什么,我都有相同的活动。让我们从字母表的开头命名。当用户使用我的应用程序时,他会通过活动并在他们之间建立自己的路径,因此他可以使用后退按钮以相应的顺序返回。
他从行动开始。 A - D - F和后退按钮他从F回到D和A.好。现在,当Android系统解析时,应用程序不再使用或在某个特定时间内需要大量RAM,系统会将其杀死。我的目标是找到,如何将应用程序恢复到以前的状态,包括已打开的活动的顺序?
可能不太清楚,所以这是一个例子:
用户已打开活动A(登录) - D - F - G,最小化,一段时间后,应用程序被杀死。当他再次启动此应用程序时,他需要登录活动A而不是他必须看到活动G(=他上次在那里),当他按下按钮时,他会去做活动F,然后活动D等等在......就像是在复活一系列活动。我知道我必须坚持存储在我的活动中的所有信息(D,F,G),但这样可以持久保存应用程序状态吗?
感谢您对此发表评论
解决方案:
我正在跟踪标志,它标识我的应用程序所处的状态。如果是0,则表示我正在正常打开新活动。在每个活动开始时,我将其放入共享首选项字符串,其中包含我的所有活动历史记录。每个活动都有自己的id(同样是sharedPref)。在另一个共享pref中,当onPause发生时,我将其保存为String公式数据(或带有GUI的数据)。我将标志设置为1.当应用程序启动且标志为1时,我从sharedPref恢复应用程序堆栈。从另一个共享首页设置每个数据。就是这样,应用程序状态得以恢复: - )
答案 0 :(得分:1)
你可以坚持你需要的任何东西,这只是一个有益的方式和内容。多年来,有多种技术被用来坚持国家。几乎所有这些都可供您使用,但需要您仔细管理。根据您的应用程序的功能,可能还有一些特殊的技巧。
第1步
确定每个活动需要什么才能有效运行。确定您可以重新计算的内容以及绝对不应重新计算的内容。例如,如果您的某个活动是某种类型的游标适配器并且根据表的键工作,则不需要保留整个活动,您只需要保留与_id
相关的任何内容。该特定活动运行。
第2步
由于您要跟踪活动历史记录,因此您需要对该历史记录进行一些表示。你提出的是一个堆栈模型,所以你需要编写自己的堆栈对象,并找到一种简单的方法来识别该堆栈中的每个活动。不要尝试保存实际的Activity引用,因为这总会导致泄漏。然后,您可以将此堆栈保存到数据库,共享首选项,文件甚至将其包装到捆绑包中。标识每个Activity的整数常量可能是实现此目的的一种方法。
第3步
确定您的保存方法,并为您的堆栈和每个Activity构建适当的保存和加载方法。
第4步
覆盖“后退”按钮以检索堆栈上的顶级活动标识符及其相应数据。 (请注意:您的堆栈最好放在扩展的Application
中)然后使用所需数据启动下一个Activity
。
第5步
当您的“登录”活动(或应用程序)启动时,加载堆栈。身份验证完成后,重新加载堆栈上的顶级Activity,通过Intent Extras传递其所需的数据。您不必一次打开所有活动,只需打开用户所在的活动。
第6步
在每个onCreate
的{{1}}或onWindowAttached
中,让它自己添加到堆栈中。在每个Activity
的{{1}}中,让它自己从堆栈中删除。由于您要保留数据,因此您可以轻松onDestroy
表示Activity
已完成。
第7步
在每个finish()
的{{1}}中,它会保存您认为重要的状态。您甚至可以保存滚动位置,只需在Activity
重新启动时重新滚动即可。在onPause
中,通过您提供的附加内容让它恢复状态。
这真的很简单。如果你需要一些样品,我很乐意提供。
FuzzicalLogic
答案 1 :(得分:1)
假设您需要做的就是重建从A到Z(或其他)的活动路径,您不需要太复杂。如果你想以正确的方式去做,请按照Fuzzical Logic的建议。如果你想让它快速运行并在那之后复杂化,你可以从这个简单的方法开始。
基本上,您将每个活动映射到代码,并维护一个简单的文本文件。每次调用一个活动时,它都应该将它的代码附加到文本文件中。所以你真的只是写一个文件,正如你在问题中解释的那样。在您的示例中,您在文本文件中有“ADFG”。
退出活动并返回时,只需读取文件,切掉最后一个字母,然后将其写出来。在您的示例中,如果您有“ADFG”,则按下该文件,该文件现在将包含“ADF”。
当您的应用启动时,只需阅读该文件,并为每个字符创建与正常情况相关的活动。读取文件一次,并在创建时将字符串传递给每个活动。因此,根活动将读取“A”并启动该活动(在包中传递字符串“DFG”),然后该活动将读取下一个字符并启动D活动(传递“FG”),依此类推,直到最后一个活动看到字符串中没有字符。
一旦完成,您可以担心如何存储每个活动的状态信息。模糊的解决方案是迄今为止最优雅,但优雅且尽快通常不会混合,所以这是你的呼唤。我将堆栈数据与堆栈中每个项目的状态数据分开。这种方式比IMO更容易。
希望有所帮助!