使用Android Application类来保存数据

Using the Android Application class to persist data

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


我认为500kb不会是那么大的交易。

你所描述的正是我如何解决我在活动中丢失数据的问题。我在Application类中创建了一个全局单例,并且能够从我使用的活动中访问它。

如果将要使用很多,您可以在Global Singleton中传递数据。

1
2
3
4
public class YourApplication extends Application
{    
     public SomeDataClass data = new SomeDataClass();
}

然后在以下任何活动中调用它:

1
2
YourApplication appState = ((YourApplication)this.getApplication());
appState.data.UseAGetterOrSetterHere(); // Do whatever you need to with the data here.

我在我的博客文章"Global Singleton"一节中讨论它。


那些依靠Application实例的人是错误的。一开始,只要整个应用程序进程存在,似乎Application就存在,但这是一个不正确的假设。

操作系统可能会根据需要终止进程。所有流程分为5个级别的"killability",在doc中指定。

因此,例如,如果您的应用由于用户接听来电而进入后台,那么根据RAM的状态,操作系统可能(或可能不会)终止您的进程(破坏Application实例过程)。

我认为更好的方法是将您的数据保存到内部存储文件,然后在您的活动恢复时读取它。

更新:

我得到了很多负面反馈,所以是时候加上澄清了。 :)好吧,最初我真的使用了一个错误的假设,即状态对应用程序非常重要。但是,如果您的应用程序没问题,有时状态会丢失(可能是某些图像只会重新读取/重新加载),那么将其保留为Application的成员就可以了。


如果要访问活动之外的"Global Singleton"并且不希望通过所有涉及的对象传递Context来获取单例,则可以在应用程序类中定义一个静态属性,该属性包含对自己的引用。只需在onCreate()方法中初始化属性即可。

例如:

1
2
3
4
5
6
7
8
public class ApplicationController extends Application {
    private static ApplicationController _appCtrl;

    public static ApplicationController getAppCtrl()
    {
         return _appCtrl;
    }
}

因为Application的子类也可以获取资源,所以只需在定义返回它们的静态方法时就可以访问它们,例如:

1
2
3
4
public static Resources getAppResources()
{
    return _appCtrl.getResources();
}

但是在传递Context引用时要非常小心,以避免内存泄漏。


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


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


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