2012-10-09 33 views
3

我正在开发一个由10多个活动组成的Android应用程序。我有几个状态对象,几乎在每个活动中都可以访问,为此,这些对象在MyApplication类中作为全局静态变量实现。Android应用程序类中的持久状态

我注意到,只要用户在应用程序中,这种方法就可以。但是,当他按下主页按钮并打开其他应用程序,然后通过“最近的活动”按钮返回到我的应用程序时,我看到Android系统重置了MyApplication中的静态图,因此我必须处理NullPointerExceptions。我知道这种行为是由Android杀死和重新创建应用程序进程造成的。

我知道持久这种数据的最好方法是使用SharedPreferences或SQLite,并且我没有问题检查MyCate == null是否在onCreate并恢复它,但问题是我没有知道正确地存储我的状态对象(在首选项或数据库中)。我试图覆盖MyApplication的finalize() - 不行,我看到onLowMemory可能不会被调用,我不明白我该如何使用onPause,OnStop等等,因为我有很多活动,以至于序列化反序列化会相当多减慢应用程序。

有什么想法? 在此先感谢!

+0

如果数据不是很大,请将您的持久性对象设置为Singleton。 – vrs

+0

因此,当Android操作系统将重新创建应用程序进程,因此重新创建应用程序类,这个对象将恢复其状态? – rrdev

+0

应用程序的重新启动/休闲取决于几个因素,如内存,应用程序的实时数量,当前没有运行的服务等。因此,将您的数据保存在主要活动中销毁或在Destroy上应用。 – vrs

回答

1

最好不要依赖Application类,除非你需要加载一些数据,在其他任何事情开始之前。 Android可以随时杀死你的进程来释放资源,所以你的应用应该能够处理这个。将所有数据保存在snigleton类中,并且延迟加载 - 检查是否为空,如果是,则加载第一次访问。它需要持续执行,考虑将其归档/共享首选项。如果没有,你的应用程序或许可以生活离不开它,所以只要确保你检查null

一般来说,你应该坚持的状态时,活动变为不活动 - onStop()onPause(),但你能尽快保存,因为它是有意义的(例如,用户输入了所有需要的数据)。分离AsyncTask以将数据保存在后台并让用户继续工作。

+0

这一切都很合理,但我们在这里谈论的是一个具有大约10个输入屏幕的应用程序(用户被要求输入数据)。所有信息都存储在一些状态对象中,这些对象用于在此流程结束时执行一些任务。每当这些活动之一进入onPause或onStop时,这是否是运行某种SaveAsyncTask(这会将数据保存在文件/首选项等中)的最佳实践? – rrdev

+0

如果你有10个屏幕,你应该检查你的设计。如果您希望用户能够从他们离开的地方拿起它,那么在每个屏幕转换中保存状态将是一个不错的主意。 –

+1

@NikolayElenkov你在哪里挂/宣布你的单身人士课程?你应该使用什么应用程序类? – powder366