在简单的应用中很少使用Application类的生命周期方法,即使在复杂的应用中也不应滥用。滥用Application类很容易覆盖多个活动之间的内存数据。这违背了Android的基于组件管理资源的设计初衷。例如,打算把Activity对象的数据引用变成Application对象的数据引用,采用的实现方式是扩展了系统在低内存情况下在应用的生命周期内获取资源的方式,这个时候,将需要在整个活动的生命周期中一直独立管理这些资源。
这里,我们实现了Application类的生命周期方法,以说明其在Android应用生命周期中的作用。另外,这些方法中的日志信息可能是有用的:
package com.finchframework.finch;import android.app.Application;import android.content.res.Configuration;import android.util.Log;/** * @author zigurd * * This the framework's Application subclass. This illustrates what * you may need to do in an Application subclass. * * To get this class instantiated, you must refer to it in the * application tag of the manifest. */public class FinchApplication extends Application { private final String TAG = this.getClass.getSimpleName; @Override public void onCreate { // First, call the parent class super.onCreate; // This is a good place to put code that must manage global data across // multiple activities, but it's better to keep most things in a // database, rather than in memory Log.i(TAG, "onCreate"); } @Override public void onTerminate { Log.i(TAG, "onTerminate"); } @Override public void onLowMemory { // In-memory caches should be thrown overboard here Log.i(TAG, "onLowMemory"); } @Override public void onConfigurationChanged(Configuration newConfig) { Log.i(TAG, "onConfigurationChanged"); if (Log.isLoggable(TAG, Log.VERBOSE)) { Log.v(TAG, newConfig.toString); } }}
在前面我们提到过,很多应用不需要继承Application类。因此,New Android Project Wizard不会创建Application子类,也不会在manifest文件中增加对Application类的引用。正如当交互应用启动时会启动初始对象那样,作为应用启动的一部分,Android系统会实例化你所创建的Application子类。和Android处理Activity子类的方式类似,它知道要对哪个类执行实例化,它会读取manifest文件中的application标签的android:name属性。确保实例化正确的最简单的处理方式是使用manifest编辑器编辑Application标签。Application标签的第一个字段是Name(如图10-7所示)。单击该字段旁边的浏览(Browse)按钮会显示应用的Application子类。
图10-7:使用manifest编辑器编辑Application标签的Name字段,在这个输入框中输入所定义的Application子类的名字
谈到Activity类的生命周期方法时,了解这些方法何时被调用是最重要的。当然,可以通过调试的方式来查看,在每个方法中设置一个断点。但是通常情况下,最翔实的信息通常融合在长时间运行的应用程序的行为中,通过Activity类和Application类的子类所使用的标签对日志进行过滤,可以清晰地了解生命周期方法到底是何时被调用的。
在Application类中最有趣的两个回调是onLowMemory方法和onTerminate方法,顾名思义,它们的任务是告诉你何时系统认为内存很低,以及何时应用结束。第二个情况不是很常见,因为大部分Android应用不需要显式退出。Android的内存管理和组件生命周期密切相关,只要正确地实现了生命周期和内存管理,它就有能力清除没用的代码。