跟着API看anroid之Application——android.app.Application

版权声明:出于感谢(如果有收获)或对知识的尊重,未经允许禁止转载 https://blog.csdn.net/bendan50/article/details/80147409

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接口。

扫描二维码关注公众号,回复: 3240886 查看本文章
从接口继承来的常量
类型 常量名 描述
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吧。




猜你喜欢

转载自blog.csdn.net/bendan50/article/details/80147409
今日推荐