使用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类并将所有数据保存在应用程序的任何位置。