Application 类的目的到底是什么。将它扩展到自定义子类有什么好处 为什么要使用它?全局变量可以存储在任何其他类中实现与 Application 相同的目标吗?
4 回答
好问题!
您的应用程序是一个在您的活动和服务运行时始终运行的上下文。
它也是第一个被创建和最后一个被销毁的上下文。因此,它围绕着您的应用程序的生命周期。
您可以使用应用程序类作为共享数据或组件的一种方式(例如,用于依赖注入)。例如,如果您想在活动之间共享单例,您可以在应用程序类中创建实例并提供一个 getter,然后所有其他上下文都可以通过
((cast to your class)getApplicationContext()).getFoo();
在某些用例中,您甚至需要在启动第一个活动之前做一些事情,然后在应用程序类的 onCreate 方法中进行。
另一方面,你不应该依赖类的onDestroy
方法Application
,因为它并不总是被调用。Android 上没有这方面的合同。
但这种情况很少见,而且通常您不需要重写应用程序类。例如,可以通过 RoboGuice 或 Dagger 以其他方式实现依赖注入。
有两件事使这个类非常有用:
- 应用程序类在任何其他活动之前实例化。
- 它包含应用程序上下文
上下文为我们带来了大量资源:我们可以找出一些设备属性、加载一些资源、启动 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);
}
}
扩展Application
类允许您集成到应用程序的生命周期中。
这对于存储全局应用程序级信息也很有用(尽管保持活动“独立”通常很好)
Application 类知道 Application Context 并在您的应用程序加载时加载,因此它在您的活动开始之前为应用程序生命周期保存适当的回调。您很可能不想扩展此类。
从 API 文档:
通常不需要子类化 Application。在大多数情况下,静态单例可以以更模块化的方式提供相同的功能。如果您的单例需要全局上下文(例如注册广播接收器),则可以为检索它的函数提供一个 Context,该上下文在首次构造单例时在内部使用 Context.getApplicationContext()。
http://developer.android.com/reference/android/app/Application.html