使用getApplicationContext()与Android中的自定义Application类的引用

时间:2012-02-11 22:29:21

标签: android-context android

我一直在研究为我的Android应用程序存储全局设置的方法,到目前为止,最好的方法似乎是扩展Application类并将共享数据存储在其中,如here所述。我发现不是使用(CustomApplicationClass)getApplicationContext().getSomething()我可以通过直接引用类中的静态方法来做同样的事情:CustomApplicationClass.getSomething()并且两种方式都可以正常工作。

这是CustomApplicationClass的一篇文章:

public class CustomApplicationClass extends Application {

  private static boolean something;

  @Override
  public void onCreate() {
    [...]
  }

  public static boolean isSomething() {
    return something;
  }

  public static void setSomething(boolean something) {
    this.something = something;
  }

}

现在,如果我想在我的代码中的某处检索“something”变量的值,比如说,从我的应用程序Activity中检索,那么它们之间是否有区别:

boolean var1 = ((CustomApplicationClass)getApplicationContext()).isSomething();

boolean var1 = CustomApplicationClass.isSomething();

?运行应用程序时,两者都可以正常工作。第二种方式是安全使用,还是不可取的?

2 个答案:

答案 0 :(得分:1)

  

我一直在研究如何为我的Android应用程序存储全局设置,到目前为止,最好的方法似乎是扩展Application类并将共享数据存储在其中,如此处所述。

除非您没有这样做。

  

我发现不是使用(CustomApplicationClass)getApplicationContext()。getSomething()我可以通过直接引用类中的静态方法来做同样的事情:CustomApplicationClass.getSomething()并且两种方式都可以正常工作细

当然。您可以轻松地CustomApplicationClass扩展Object,然后执行CustomApplicationClass.getSomething()。当前的方法与仅使用Java中的普通单例模式相比,您没有获得任何好处,并且您正在失去灵活性,因为应用程序只能有一个Application的自定义子类。

  

第二种方式是安全的,还是不可取的?

第一种方法毫无意义,因为您的数据成员和方法是静态的。

或者:

  1. CustomApplicationClass 而非中的内容设为static,然后使用getApplicationContext()

  2. 重构CustomApplicationClass以不扩展Application,然后使用静态数据成员和/或访问器方法,或更正式地切换到the Java singleton pattern

    < / LI>

    就个人而言,我会选择#2选项。

答案 1 :(得分:0)

如果你检查android.app.Application(http://developer.android.com/reference/android/app/Application.html)的api,你会发现类概述如下:

需要维护全局应用程序状态的基类。您可以通过在AndroidManifest.xml的标记中指定其名称来提供自己的实现,这将导致在创建应用程序/包的过程时为您实例化该类。

通常不需要子类Application。在大多数情况下,静态单例可以以更模块化的方式提供相同的功能。如果您的单例需要全局上下文(例如注册广播接收器),则可以为内部使用的Context提供检索它的函数。 Context.getApplicationContext()在第一次构造单例时。