我正在开发一个相当复杂的 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">这里。

您可以创建应用类别及节省的呼叫你所有的数据,我们不是在你的应用程序的任何地方。

scroll top