使用Android应用程序类来保存数据
我正在研究一个相当复杂的Android应用程序,这个应用程序需要大量关于应用程序的数据(总共大约500KB–对于移动设备来说这么大?)。 从我所知道的情况来看,应用程序(在活动中,更准确地说)的任何方向变化都会导致活动的彻底破坏和重新创建。 根据我的发现,Application类没有相同的生命周期(即,对于所有意图和目的,总是实例化)。 将状态信息存储在应用程序类中,然后从Activity引用它,或者由于移动设备上的内存限制,通常不是“可接受的”方法? 我真的很感谢在这个话题上的任何建议。 谢谢!
我不认为500KB将是一个很大的交易。
您所描述的正是我如何处理我在活动中丢失数据的问题。 我在Application类中创建了一个全局单例,并能够从我使用的活动中访问它。
如果将要使用很多,你可以在Global Singleton中传递数据。
public class YourApplication extends Application { public SomeDataClass data = new SomeDataClass(); }
然后通过以下方式在任何活动中致电
YourApplication appState = ((YourApplication)this.getApplication()); appState.data.UseAGetterOrSetterHere(); // Do whatever you need to with the data here.
我在我的博客文章 “Global Singleton”一节中讨论它。
那些依靠Application
实例的人是错误的。 起初,只要整个应用程序存在,似乎应用程序就存在,但这是不正确的假设。
操作系统可能会根据需要终止进程。 所有过程分为文档中指定的 5个“killability”级别。
因此,例如,如果您的应用程序由于用户应答来电而进入后台,则根据RAM的状态,操作系统可能(或可能不)杀死您的进程(在进程中销毁Application
实例)。
我认为更好的方法是将数据保存到内部存储文件中 ,然后在活动恢复时读取它。
更新:
我得到了很多负面的反馈,所以现在是时候补充说明了。 :)那么,最初我真的用了一个错误的假设,即状态对于应用程序来说真的很重要。 但是,如果您的应用程序可以确保有时状态丢失(可能是某些图像将被重新读取/重新下载),那么完全可以将其保留为Application
的成员。
如果你想访问一个活动之外的“Global Singleton”,并且你不想通过所有涉及的对象传递Context
来获得单例,那么你可以在你的应用程序类中定义一个静态属性,本身。 只需在onCreate()
方法中初始化属性即可。
例如:
public class ApplicationController extends Application { private static ApplicationController _appCtrl; public static ApplicationController getAppCtrl() { return _appCtrl; } }
因为Application
子类也可以获得资源,所以只要定义了一个静态方法就可以访问它们,如下所示:
public static Resources getAppResources() { return _appCtrl.getResources(); }
但是在传递Context引用时要非常小心,以避免内存泄漏 。
戴夫,它是什么样的数据? 如果它是与整个应用程序有关的一般数据(例如:用户数据),则扩展Application类并将其存储在那里。 如果数据与Activity相关,则应使用onSaveInstanceState和onRestoreInstanceState处理程序在屏幕旋转上保留数据。
您实际上可以覆盖方向功能,以确保您的活动不被破坏和重新创建。 看这里
我发现很好的例子,为什么我们不应该在应用程序类使用全局对象。 例子
希望它可以帮助你
您可以创建Application类并将所有数据保存在应用程序的任何位置。