静态类与Android应用程序具有相同的生命周期吗?

时间:2015-07-22 08:17:08

标签: java android static lifecycle

首先,我的代码看起来像这样。数据中心类需要上下文才能到达SharedPreference。

class App extends Application
{
    private DataCenter dataCenter;
    @Override
    public void onCreate() {
        super.onCreate();
        dataCenter = new DataCenter(this);
    }
}

当我在我的活动中使用dataCenter时,我必须使用getApplicationContext()并转换为我的应用程序,然后获取dataCenter对象。

然后我搜索了stackoverflow,并意识到我可以让App有一个静态字段来引用它自己。

class App extends Application
{
    private DataCenter dataCenter;
    public static App me;
    @Override
    public void onCreate() {
        super.onCreate();
        App.me = this;
        dataCenter = new DataCenter(this);
    }
}

通过这样做,我不再需要调用getApplicationContext()并在我的activity类中进行转换,只需要App.me.getDataCenter()。而且在App的构造函数中,我甚至可以不将上下文传递给dataCenter的consctrutor,而只是直接在DataCenter类中引用App.me.

(Q1)我想知道我在做什么是好的,这里有任何风险吗?

之后,我意识到我是否想在我的活动中使用dataCenter," App.me.getDataCenter()"对我来说还是太长了

(Q2)我可以将DataCenter类设置为静态,因为它可以访问App.me以静态获取上下文吗?

(Q3)静态类与android的应用程序具有相同的生命周期?并且Application类总是首先出现?

1 个答案:

答案 0 :(得分:1)

首先,最好以改变可变的范围me私人,其名称改为一个更好和更描述性的(例如instance),并创建get()方法,该方法将返回Application的实例。当你把这个变量公开时,可以改变它,我想你不想要它。

  

(Q1)我想知道我在做什么是好的,这里有任何风险吗?

     

之后,我意识到我是否想在我的活动中使用dataCenter,   “App.me.getDataCenter()”对我来说还太长了

我认为,您应该使用SharedPreferences类的一个实例。如果DataCenter使用SharedPreferences,则不应混合应用和活动的上下文。您应该选择一个上下文并继续使用它。在我看来,应用程序的上下文是一个更好的选择,因为您可能希望在许多活动中使用此对象。此外,您无需每次在活动中致电App.me.getDataCenter()。只需将它传递给Application类。

  

(Q2)我可以将DataCenter类设置为静态,因为它可以访问   App.me静态获取上下文?

你可以,但你应该避免静态类。使用静态类时,为应用程序编写单元测试更加困难。此外,在加载类时,不会选择静态对象进行垃圾回收。这意味着,您的应用程序将消耗更多的设备内存,效率会降低。

  

(Q3)是静态类与android的Application具有相同的生命周期   ?并且Application类总是首先初始化?

在使用派生自Application类的类中的静态变量时,应用程序的生命周期不应更改。