在上一篇文章中咱们了解到Android系统启动应用的时候,会首先加载AndroidManifest.xml清单文件中的一系列信息,在清单文件中若是不指定<application></application>标签中的name属性值,会默认使用android.app.Application
做为应用程序加载类,其生命周期与应用程序生命周期是一致的。那么到底应用程序有怎样的生命周期,在不一样的生命周期有哪些调用方法可使用?这章将详细介绍。html
首先要知道,一个应用程序,有且仅有一个android.app.Application类与之对应,若是想在清单文件中使用自定义的Application
,也必须是继承自android.app.Application
的子类。Application
的实例在Android系统启动应用时优先于应用中其余任何类而建立。android
因为Applicaiton
是android.content.ContentWrapper的子类,因此在Application
被实例化建立后,Android系统会优先调用该类的attachBaseContext(Context base)
方法,从而将上下文环境base参数与该应用程序绑定。app
这里的 android.content.Context是Android系统对应用程序建立的运行环境,经过该类能够访问应用程序的资源文件、发送意图、接收广播等应用程序级操做。框架
Android系统中定义ContentWrapper
类做为父类,被须要绑定上下文环境的组件继承。理论上,任何继承自ContentWrapper
的子类,均可以重载其attachBaseContent(Context base)
方法,同时在该方法内保证优先调用其父类方法super.attachBaseContext(base)
以确保该组件被正常加载。然而并不推荐重载该方法,若是只是想获取上下文环境使用,在组件类内部,只要是在调用attachBaseContent(Contxt base)
以后,均可以调用getBaseContext()
得到该组件的上下文环境。google
当Application
类与上下文环境绑定后,说明该应用程序已经加载运行环境,Android系统会继续调用onCreate()
方法,代表该应用程序已建立。因此自定义的Application
能够重载该方法,以完成在应用程序建立初期就要执行的操做。通常应用中使用的第三方框架都会在此处初始化,以保证应用建立之时就初始化框架结构。在重载该方法时,必定要优先调用其父类方法super.onCreate()
。code
以后Android系统再根据清单文件中的组件信息分别加载建立...... 此段暂且不提。xml
在应用程序运行过程当中,当Android系统所搭载的硬件设备发生变化时,Android系统会调用该类的onConfigurationChanged(Configuration newConfig)
方法。若是重载该方法,能够响应android.content.res.Configuration类中所涉及到的硬件设备变化,例如常见的横竖屏切换、应用夜间主题与正常主题切换等,均可以在这里处理。另外,在重载该方法时,必定要优先调用其父类方法super.onConfigurationChanged(newConfig)
。htm
Android系统运行内存空间使用殆尽,可能致使应用程序没法正常运行。而此时当前应用程序若是还在前台运行,Android系统会调用该类的onLowMemory()
方法,以后会杀死应用程序中的后台服务。若是重载该方法,能够释放一些不须要的资源,以防止内存空间进一步缩减,将可能保留前台界面。一样,在重载该方法时,必定要优先调用其父类方法super.onLowMemory()
。blog
而当Android系统运行内存空间使用殆尽时,应用程序也可能刚好在后台运行,此时Android系统会调用该类的onTrimMemory(int level)
方法,以代表应用程序即将被Android系统杀死。其中的level参数能够代表当前应用程序所处等级,level等级低的将优先被Android系统彻底杀死。若是重载该方法,则不是释放资源就能解决的了,能够执行一些数据持久化保存操做,防止应用程序被杀死后再次启动后出现数据不一致的状况。一样,在重载该方法时,必定要优先调用其父类方法super.onTrimMemory(level)
。继承
值得注意的是,应用程序被用户主动杀死时,在该类中是没有方法响应的。
保存应用程序全局变量使用。不推荐该方式,由于当应用程序中含有多个进程时,每一个进程在建立时都会开辟新的内存空间,同时在新内存中建立新的Application
实例与之对应,不一样进程中的全局变量也就不一致了。
初始化第三方框架,具体使用方式可根据第三方框架教程相应调用。