0、写在前面的话
利用小小的五一假期,宅在电脑前仔细读着API,并整理下,希望通过手敲一次,对类的理解会更深刻。
适用者说明:系统了解Application,但又不想看英文API的读者。如果想快速了解Application及应用,这篇可能不适合,还是去百度其他的吧。
声明:本文主要参考API文档,及部分google翻译。
1、Application概述
类位置:android.app.Application
类声明:public class Application extends ContextWrapper implements ComponentCallbacks2
直接子类:MultiDexApplication
类说明:做为一个维护应用程序全局状态的基类,可以被继承。其子类需要在AndroidManifest.xml文件中的<application>标签下使用"android:name"进行声明。需要提醒的是:该类及子类的实例化在任何类的实例化前面,及应用程序开始运行时,先执行了该类的onCreate()方法;而界面类(Activity)在它之后被实例化。
Note:在多数情况下都不需要子类化应用程序,可通过静态单例模式获取相同的功能。如果需要获取全局的上下文Context(例如注册广播接收器),可以通过Context.getApplicationContext()方式。因为Application是Context的间接子类。
2、Application常量
通过Application类的声明,可以看到它的继承关系,直接继承ContextWrapper ,从而属于间接性的继承Context。所以上一篇博文介绍的Context类中的常量,Application基本都具有。需要注意的是,Application还实现了ComponentCallbacks2接口,下面只列出这部分常量——来自ComponentCallbacks2接口。
类型 | 常量名 | 描述 |
---|---|---|
int | TRIM_MEMORY_BACKGROUND | 后台运行,进程已经进入到LRU队列顶部(最近最小使用)内存页面置换算法 |
int | TRIM_MEMORY_COMPLETE | 完成,进程在LRU队列尾部,没有找到更多内存的情况下,该进程则被终止 |
int | TRIM_MEMORY_MODERATE | 缓和,进程放入LRU队列中间, |
int | TRIM_MEMORY_RUNNING_CRITICAL | 内存最不足时运行,当内存最不足时也不会被终止 |
int | TRIM_MEMORY_RUNNING_LOW | 内存更低时运行,当内存更不足时,不会被终止,但需要施放资源 |
int | TRIM_MEMORY_RUNNING_MODERATE | 内存中等运行,内存刚开始不足时不会被终止 |
int | TRIM_MEMORY_UI_HIDDEN | 隐藏用户UI,此时可以施放大量仅被UI占用的资源。 |
进程的内存管理 |
通过onTrimMemory(int)方法设置,做为方法的参数 |
3、Application的公有函数
本部分分两小节,第一节为Application自身的函数及更高继承来的函数(从ComponentCallbacks接口继承的),第二节为从ComponentCallbacks2接口继承来的函数,而继承自Context的函数不再表述。
3.1Application的函数
void onConfigurationChanged(Configuration newConfig)
函数说明:由系统调用,当组件运行时设备配置信息发生了改变。
参数说明:Configuration。android.content.res.Configuration 这个类描述了设备的所有配置信息,包括用户指定的配置选项(区域设置和缩放比例)以及设备配置(如输入设置、屏幕大小、屏幕方向等)。
该类对象的获取方式:从Resources类,调用getConfiguration().如果是从Activity,则可以先得到Resources。
------------------------------------------------函数分割线------------------------------------------------------
void onCreate()
函数说明:当应用程序开始时,被调用。根据Application类的说明,该方法在任何Activity、Service、Receiver对象(除了Content provider)之前被创建执行。
可以理解为是应用程序的入口函数!!继承Application的子类,必须重写该方法。
------------------------------------------------函数分割线------------------------------------------------------
void onLowMemory()
函数说明:当整个系统内存不足时被调用,当前运行的进程应该缩减内存使用。
------------------------------------------------函数分割线------------------------------------------------------
void onTerminate()
函数说明:此方法适用于仿真过程环境。
------------------------------------------------函数分割线------------------------------------------------------
void registerActivityLifecycleCallbacks(Application.ActivityLifecycleCallbacks callback)
void unregisterActivityLifecycleCallbacks(Application.ActivityLifecycleCallbacks callback)
一对相对应的函数。注册活动生命周期的回调和注销活动生命周期的回调。关于参数说明,下面具体介绍,其为Application的内部嵌套类。
------------------------------------------------函数分割线------------------------------------------------------
void registerComponentCallbacks(ComponentCallbacks callback)
void unregisterComponentCallbacks(ComponentCallbacks callback)
一对相对应的函数。注册或注销一个ComponentCallbacks,在Context基础应用程序中。当ComponentCallbacks活动方法和组件被调用时,同时也调用它们。
参数说明:ComponentCallbacks。组件回调。Application类所实现的一个更上一层的接口。ComponentCallbacks2是对它的扩展,增加了一个新的回调(onTrimMemory(int))以实现更细粒度的内存管理。适用于所有组件(Activity、Service、ContentProvider、Application)。可以理解为一组通用的回调API。
------------------------------------------------函数分割线------------------------------------------------------
void registerOnProvideAssistDataListener(Application.OnProvideAssistDataListener callback)
void unregisterOnProvideAssistDataListener(Application.OnProvideAssistDataListener callback)
一对相对应的函数。注册提供辅助的数据监听器和注销提供辅助的数据监听器。关于参数说明,下面具体介绍,其为Application的内部嵌套类。
3.2从ComponentCallbacks2接口继承来的函数
void onTrimMemory(int level)
当操作系统在一个适当的时机进行进程的内存回收整理时被调用。如:进程处于后台运行,并且此时没有足够的内存来保证更可能多的运行后台进程时,该方法就会被调用。对于进程级别的比较,不要采用确切具体的值,因为很可能会被插入中间值。如果想在任意点查看当前进程的修剪内存级别,可通过下述方式:
ActivityManager.getMyMemoryState(RunningAppProcessInfo)
关于ComponentCallbacks2的一点说明:
以基于当前系统约束增量释放内存。 使用此回调释放资源有助于提供更全面的响应式系统,但也可让系统保持您的流程长久存活,从而直接为您的应用提供用户体验。 也就是说,如果您没有根据此回调定义的内存级别来裁减资源,那么当系统缓存在最近最少使用(LRU)列表中时,系统更可能会终止进程,因此需要重新启动应用程序 并在用户返回时恢复所有状态。
参数说明:即为上文描述的Application常量。分为三类(前台运行、后台运行、隐藏UI界面)
NOTE:当系统开始杀死LRU列表中的进程时,虽然它主要是自下而上的,但它确实考虑了哪些进程消耗了更多的内存,并因此在内存中提供了更多的收益。 因此,在整个LRU列表中消耗的内存越少,留在列表中的机会就越好,并且能够快速恢复。
本节小结:
Application继承了Context,而所实现的接口主要目的是增加回调以及对内存的更细致化管理。
4、Application的内部嵌套接口
上文在介绍Application的函数时已经提到了它的两个嵌套接口,下面分别进行说明。
4.1Application.ActivityLifecycleCallbacks
声明:public static interface Application.ActivityLifecycleCallbacks
主要包含了一些Activity生命周期各阶段的对应回调,均为抽象方法。如下图
4.2Application.OnProviderAssistDataListener
声明:public static interface Application.OnProvideAssistDataListener
只包含一个方法,如下图:
我们可以重写这个函数,将希望显示在Intent的数据放入Bundle data中。
5、结束语
当我打“结束语”这三个字的时候,突然有种写论文的感觉。
接下来,计划着去了解几大组件:Service、BoardcastReceiver吧。