我正在开发一个相当复杂的Android应用程序,它需要关于应用程序的大量数据(我说总共大约500KB - 这对于移动设备来说是否很大?)。据我所知,应用程序中的任何方向更改(在活动中,更准确地说)会导致活动的完全破坏和重新创建。根据我的发现,Application类没有相同的生命周期(即,所有意图和目的,它总是被实例化)。将状态信息存储在应用程序类中然后从Activity引用它是否有意义,或者由于移动设备上的内存限制,这通常不是“可接受的”方法?我真的很感激有关这个主题的任何建议。谢谢!
答案 0 :(得分:131)
我认为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”一节中讨论here in my blog post。
答案 1 :(得分:56)
依靠Application
实例的人是错误的。起初,只要整个应用程序进程存在,似乎Application
似乎存在,但这是一个不正确的假设。
操作系统可能会根据需要终止进程。所有流程分为5个级别的“killability”specified in the doc。
因此,例如,如果您的应用由于用户接听来电而进入后台,那么根据RAM的状态,操作系统可能(或可能不会)终止您的进程(摧毁{{ 1}}过程中的实例)。
我认为更好的方法是persist your data to internal storage file,然后在您的活动恢复时阅读。
<强>更新强>
我收到了很多负面反馈,所以是时候加上澄清了。 :)好吧,最初我真的使用了一个错误的假设,即状态对应用程序非常重要。但是,如果您的应用程序没问题,有时状态会丢失(可能是某些图像只会重新读取/重新加载),那么将其保留为Application
的成员就完全可以了。
答案 2 :(得分:6)
如果您想要访问活动之外的“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();
}
但是在传递对avoid memory leaks的上下文引用时要非常小心。
答案 3 :(得分:2)
答案 4 :(得分:1)
您实际上可以覆盖方向功能,以确保不会销毁和重新创建您的活动。看here。
答案 5 :(得分:0)
您可以创建Application类并将所有数据保存在该calss中,以便在应用程序的任何位置使用。
答案 6 :(得分:0)
我知道这是一个非常老的问题,但是使用ViewModel from the jetpack components是在两次Activity轮换之间保留数据的最佳方法。
ViewModel类旨在以生命周期感知的方式存储和管理与UI相关的数据。 ViewModel类允许数据在配置更改(例如屏幕旋转)中幸存下来。