使用Android Application类来保存数据

时间:2010-11-17 20:34:13

标签: android application-lifecycle

我正在开发一个相当复杂的Android应用程序,它需要关于应用程序的大量数据(我说总共大约500KB - 这对于移动设备来说是否很大?)。据我所知,应用程序中的任何方向更改(在活动中,更准确地说)会导致活动的完全破坏和重新创建。根据我的发现,Application类没有相同的生命周期(即,所有意图和目的,它总是被实例化)。将状态信息存储在应用程序类中然后从Activity引用它是否有意义,或者由于移动设备上的内存限制,这通常不是“可接受的”方法?我真的很感激有关这个主题的任何建议。谢谢!

7 个答案:

答案 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)

戴夫,这是什么类型的数据?如果它是与整个应用程序相关的一般数据(例如:用户数据),则扩展Application类并将其存储在那里。如果数据属于Activity,则应使用onSaveInstanceState和onRestoreInstanceState处理程序在屏幕旋转时保留数据。

答案 4 :(得分:1)

您实际上可以覆盖方向功能,以确保不会销毁和重新创建您的活动。看here

答案 5 :(得分:0)

您可以创建Application类并将所有数据保存在该calss中,以便在应用程序的任何位置使用。

答案 6 :(得分:0)

我知道这是一个非常老的问题,但是使用ViewModel from the jetpack components是在两次Activity轮换之间保留数据的最佳方法。

  

ViewModel类旨在以生命周期感知的方式存储和管理与UI相关的数据。 ViewModel类允许数据在配置更改(例如屏幕旋转)中幸存下来。