19

Application 类的目的到底是什么。将它扩展到自定义子类有什么好处 为什么要使用它?全局变量可以存储在任何其他类中实现与 Application 相同的目标吗?

4

4 回答 4

13

好问题!

您的应用程序是一个在您的活动和服务运行时始终运行的上下文。

它也是第一个被创建和最后一个被销毁的上下文。因此,它围绕着您的应用程序的生命周期。

您可以使用应用程序类作为共享数据或组件的一种方式(例如,用于依赖注入)。例如,如果您想在活动之间共享单例,您可以在应用程序类中创建实例并提供一个 getter,然后所有其他上下文都可以通过

((cast to your class)getApplicationContext()).getFoo();

在某些用例中,您甚至需要在启动第一个活动之前做一些事情,然后在应用程序类的 onCreate 方法中进行。

另一方面,你不应该依赖类的onDestroy方法Application,因为它并不总是被调用。Android 上没有这方面的合同。

但这种情况很少见,而且通常您不需要重写应用程序类。例如,可以通过 RoboGuice 或 Dagger 以其他方式实现依赖注入。

于 2012-11-15T15:20:56.420 回答
4

有两件事使这个类非常有用:

  1. 应用程序类在任何其他活动之前实例化。
  2. 它包含应用程序上下文

上下文为我们带来了大量资源:我们可以找出一些设备属性、加载一些资源、启动 SQLite 数据库等等。

所有这些都发生在任何活动加载之前,并且所有这些都对活动全局可用。

我的意思的简单示例:

public class App extends Application{
    private static Resources sResources;

    //--I want to load strings resources from anywhere--
    public static String loadStringResource(int resID) {
        return sResources.getString(resID);
    }


    @Override
    public void onCreate() {
        super.onCreate();

        sResources = getResources();

        //---I want to load all preferences when my app starts---
        PreferenceManager.setDefaultValues(this,R.xml.prefs,false);

    }
}
于 2012-11-15T15:19:24.287 回答
1

扩展Application类允许您集成到应用程序的生命周期中。

这对于存储全局应用程序级信息也很有用(尽管保持活动“独立”通常很好)

于 2012-11-15T15:19:39.963 回答
0

Application 类知道 Application Context 并在您的应用程序加载时加载,因此它在您的活动开始之前为应用程序生命周期保存适当的回调。您很可能不想扩展此类。

从 API 文档:

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

http://developer.android.com/reference/android/app/Application.html

于 2012-11-15T15:21:25.623 回答