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