我正在开发一个相当复杂的 Android 应用程序,它需要关于应用程序的大量数据(我会说总共大约 500 KB——对于移动设备来说这么大吗?)。据我所知,应用程序中的任何方向变化(更准确地说是在活动中)都会导致活动的完全破坏和重新创建。根据我的发现,Application 类没有相同的生命周期(即,出于所有意图和目的,它总是被实例化)。将状态信息存储在应用程序类中然后从 Activity 引用它是否有意义,或者由于移动设备上的内存限制,这通常不是“可接受的”方法?我非常感谢有关此主题的任何建议。谢谢!
7 回答
我认为 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.
我在我的博客文章中讨论了它,在“全局单例”部分下。
那些指望Application
实例的人是错误的。起初,似乎Application
只要整个应用程序进程存在,它就存在,但这是一个错误的假设。
操作系统可能会根据需要终止进程。所有进程都分为doc 中指定的5 个“可杀性”级别。
因此,例如,如果您的应用程序由于用户接听来电而进入后台,那么根据 RAM 的状态,操作系统可能(或可能不会)杀死您的进程(破坏进程中的Application
实例) .
我认为更好的方法是将您的数据保存到内部存储文件中,然后在您的活动恢复时读取它。
更新:
我收到了很多负面反馈,所以是时候添加说明了。:) 好吧,最初我确实使用了一个错误的假设,即状态对应用程序非常重要。但是,如果您的应用程序正常,有时状态会丢失(可能是一些图像将被重新读取/重新下载),那么将其保留为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();
}
但是在传递上下文引用时要非常小心,以避免内存泄漏。
戴夫,这是什么数据?如果是与整个应用程序相关的一般数据(例如:用户数据),则扩展 Application 类并将其存储在那里。如果数据与 Activity 相关,则应使用 onSaveInstanceState 和 onRestoreInstanceState 处理程序将数据保留在屏幕旋转上。
您实际上可以覆盖方向功能,以确保您的活动不会被破坏和重新创建。看这里。
您可以创建应用程序类并将所有数据保存在该类上,以便在应用程序中的任何位置使用。
我知道这是一个非常古老的问题,但使用喷气背包组件中的 ViewModel是在 Activity 轮换之间保存数据的最佳方式。
ViewModel 类旨在以生命周期意识的方式存储和管理与 UI 相关的数据。ViewModel 类允许数据在配置更改(例如屏幕旋转)后继续存在。