Android中Application类的用途是什么?

时间:2012-11-15 15:15:56

标签: android

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

4 个答案:

答案 0 :(得分:7)

好问题!

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

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

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

获取单例。
((cast to your class)getApplicationContext()).getFoo();

可能有一些用例需要在启动第一个活动之前执行操作,然后在应用程序类的onCreate方法中执行。

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

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

答案 1 :(得分:3)

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

  1. 应用程序类在任何其他Activity之前实例化。
  2. 它包含应用程序上下文
  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