使用 Android Application 类来保存数据
-
25-09-2019 - |
题
我正在开发一个相当复杂的 Android 应用程序,该应用程序需要大量有关该应用程序的数据(我想说总共大约 500KB - 对于移动设备来说这个数据大吗?)。据我所知,应用程序中(更准确地说是活动中)的任何方向变化都会导致活动的完全破坏和重新创建。根据我的发现,Application 类没有相同的生命周期(即出于所有意图和目的,它总是被实例化)。将状态信息存储在应用程序类内部然后从 Activity 引用它是否有意义,或者由于移动设备上的内存限制,这通常不是“可接受的”方法?我真的很感谢有关这个主题的任何建议。谢谢!
解决方案
我认为 500kb 没什么大不了的。
您所描述的正是我解决活动中丢失数据问题的方法。我在 Application 类中创建了一个全局单例,并且能够从我使用的活动中访问它。
如果要经常使用数据,您可以在全局单例中传递数据。
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.
我讨论一下 在我的博客文章中, ,在“全局单例”部分下。
其他提示
这些谁在Application
实例数是错误的。起初,它可能看起来好像存在,只要整个应用过程中存在的Application
但是这是一个不正确的假设。
OS可以杀死过程是必要的。所有过程都分为5级“killability” 在doc指定的
所以,举例来说,如果应用程序云在背景由于用户应答来话呼叫,则根据RAM的状态,OS可以(或可以不)杀死你的处理(销毁Application
实例在这个过程中)。
我想一个更好的办法是坚持你的数据到内部存储文件,然后当你的活动恢复阅读它。
<强>更新强>
我得到许多负反馈,所以它是时间添加澄清。 :)好了,最初我真的用一个错误的假设,即国家是应用非常重要。但是,如果你的应用程序是OK,有时状态丢失(这可能是一些图像,这将是刚刚重读/重新下载),那么它是完全OK,以保持它作为Application
中的一员。
如果您要访问一个活动的“全球单身”外,你不想通过所有涉及的对象传递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();
}
但是上下文的引用传递到周围避免内存泄漏时必须非常小心
戴夫,什么样的数据呢?如果是一般的数据,涉及到该应用程序作为一个整体(例如:用户数据),则扩展应用程序类,并存储在那里。如果数据涉及的活性,则应该使用的onSaveInstanceState和onRestoreInstanceState处理程序坚持在屏幕上旋转的数据。
您可以真正覆盖方位的功能,以确保您的活动不被破坏并重新创建。外表 href="https://stackoverflow.com/questions/456211/activity-restart-on-rotation-android">这里。
您可以创建应用类别及节省的呼叫你所有的数据,我们不是在你的应用程序的任何地方。