上一篇文章中我们了解到Android系统启动应用的时候,会首先加载AndroidManifest.xml清单文件中的一系列信息,在清单文件中如果不指定<application></application>标签中的name属性值,会默认使用android.app.Application作为应用程序加载类,其生命周期与应用程序生命周期是一致的。那么到底应用程序有怎样的生命周期,在不同的生命周期有哪些调用方法可以使用?这章将详细介绍。

生命周期

应用实例化

首先要知道,一个应用程序,有且仅有一个android.app.Application类与之对应,如果想在清单文件中使用自定义的Application,也必须是继承自android.app.Application的子类。Application的实例在Android系统启动应用时优先于应用中其他任何类而创建。

应用加载运行环境

由于Applicaitonandroid.content.ContentWrapper的子类,所以在Application被实例化创建后,Android系统会优先调用该类的attachBaseContext(Context base)方法,从而将上下文环境base参数与该应用程序绑定。

这里的 android.content.Context是Android系统对应用程序创建的运行环境,通过该类可以访问应用程序的资源文件、发送意图、接收广播等应用程序级操作。

Android系统中定义ContentWrapper类作为父类,被需要绑定上下文环境的组件继承。理论上,任何继承自ContentWrapper的子类,都可以重载其attachBaseContent(Context base)方法,同时在该方法内保证优先调用其父类方法super.attachBaseContext(base)以确保该组件被正常加载。然而并不推荐重载该方法,如果只是想获取上下文环境使用,在组件类内部,只要是在调用attachBaseContent(Contxt base)之后,都可以调用getBaseContext()获得该组件的上下文环境。

应用创建

Application类与上下文环境绑定后,说明该应用程序已经加载运行环境,Android系统会继续调用onCreate()方法,表明该应用程序已创建。所以自定义的Application可以重载该方法,以完成在应用程序创建初期就要执行的操作。一般应用中使用的第三方框架都会在此处初始化,以保证应用创建之时就初始化框架结构。在重载该方法时,一定要优先调用其父类方法super.onCreate()

其他应用内操作

之后Android系统再根据清单文件中的组件信息分别加载创建...... 此段暂且不提。

应用硬件改变

在应用程序运行过程中,当Android系统所搭载的硬件设备发生变化时,Android系统会调用该类的onConfigurationChanged(Configuration newConfig)方法。如果重载该方法,可以响应android.content.res.Configuration类中所涉及到的硬件设备变化,例如常见的横竖屏切换、应用夜间主题与正常主题切换等,都可以在这里处理。另外,在重载该方法时,一定要优先调用其父类方法super.onConfigurationChanged(newConfig)

应用低内存警告

Android系统运行内存空间使用殆尽,可能导致应用程序无法正常运行。而此时当前应用程序如果还在前台运行,Android系统会调用该类的onLowMemory()方法,之后会杀死应用程序中的后台服务。如果重载该方法,可以释放一些不需要的资源,以防止内存空间进一步缩减,将可能保留前台界面。同样,在重载该方法时,一定要优先调用其父类方法super.onLowMemory()

应用内存杀死

而当Android系统运行内存空间使用殆尽时,应用程序也可能恰好在后台运行,此时Android系统会调用该类的onTrimMemory(int level)方法,以表明应用程序即将被Android系统杀死。其中的level参数可以表明当前应用程序所处等级,level等级低的将优先被Android系统完全杀死。如果重载该方法,则不是释放资源就能解决的了,可以执行一些数据持久化保存操作,防止应用程序被杀死后再次启动后出现数据不一致的情况。同样,在重载该方法时,一定要优先调用其父类方法super.onTrimMemory(level)

值得注意的是,应用程序被用户主动杀死时,在该类中是没有方法响应的。

常用案例

  • 保存应用程序全局变量使用。不推荐该方式,因为当应用程序中含有多个进程时,每个进程在创建时都会开辟新的内存空间,同时在新内存中创建新的Application实例与之对应,不同进程中的全局变量也就不一致了。

  • 初始化第三方框架,具体使用方式可根据第三方框架教程相应调用。

Android系统编程入门系列之应用初始化Application的更多相关文章

  1. Android系统编程入门系列之加载界面Activity

    上回说到应用初始化加载及其生命周期,在Android系统调用Applicaiton.onCreate()之后,继续创建并加载清单文件中注册的首个界面即主Activity,也可称之为入口界面.主Acti ...

  2. Android系统编程入门系列之应用环境及开发环境介绍

        作为移动端操作系统,目前最新的Android 11.0已经发展的比较完善了,现在也到了系统的整理一番的时间,接下来的系列文章将以Android开发者为中心,争取用归纳总结的态度对初级入门者所应 ...

  3. Android系统编程入门系列之界面Activity响应多元的属性动画

    在响应丝滑动画一篇文章中,分别介绍了作用于普通视图.绘制视图的绘制对象.和界面这三种对象的动画效果,但是都有一些使用的局限性.比如这些动画都只是以屏幕上绘制更新的方式绘制动画,并没有真实改变作用对象的 ...

  4. Android系统编程入门系列之加载服务Service

    之前几篇文章简单梳理了在Android系统的四大组件之一,最主要的界面Activity中,使应用程序与用户进行交互响应的相关知识点,那对于应用程序中不需要与用户交互的逻辑,又要用到哪些内容呢?本文开始 ...

  5. Android系统编程入门系列之服务Service齐头并进多线程任务

    在上篇文章中初步了解了Android系统的四大组件之一的服务Service,在服务内可以执行无用户交互的耗时操作任务,但是包括之前关于界面系列文章在内,生命周期方法都是在主线程内被系统回调的.如果直接 ...

  6. Android系统编程入门系列之界面Activity绘制展示

    上篇文章介绍了界面Activity的启动方式和生命周期,本篇将继续介绍在界面Activity中的内容是如何绘制展示给用户的. 在Android系统上运行新创建的界面Activtiy,给用户展示的是空白 ...

  7. Android系统编程入门系列之界面Activity交互响应

    在上篇文章中已经了解到界面Activity的绘制完全依赖其加载的视图组件View,不仅如此,用户的每次触摸操作都可以在界面Activity内接收并响应,也可以直接传递给其中的某个视图View响应.本文 ...

  8. Android系统编程入门系列之界面Activity响应丝滑的传统动画

    上篇文章介绍了应用程序内对用户操作响应的相关方法位置,简单的响应逻辑可以是从一个界面Activity跳转到另一个界面Activity,也可以是某些视图View的相对变化.然而不管是启动一个界面执行新界 ...

  9. Android系统编程入门系列之服务Service中的进程间通信

    在上篇文章以线程间的通信方式Handler类结尾,服务Service还支持的进程间通信,又是具体怎么实现的呢?这就要用到加载服务一文中提到的AIDL语言规范了. AIDL是 Android Inter ...

随机推荐

  1. MySQL如何快速插入数据

    前言: 日常学习和工作中,经常会遇到导数据的需求.比如数据迁移.数据恢复.新建从库等,这些操作可能都会涉及大量数据的导入.有时候导入进度慢,电脑风扇狂转真的很让人崩溃,其实有些小技巧是可以让导入更快速 ...

  2. CRM帮助初创企业降本增效的四个方法

    对大部分初创公司来说,只有少数企业能够实现盈利,大部分只能维持盈亏平衡甚至是亏损.这是因为初创企业很难在短时间之内找到稳定的赢利点,而企业面临的风险和投入又是无法预知的.初创企业想要快速盈利,只能降低 ...

  3. [bug] flink on yarn 启动失败

    参考 https://www.cnblogs.com/huangguoming/p/11732663.html

  4. [c++] 子类构造函数中有默认参数

    子类创建对象时调用父类的构造函数: 1 #include <iostream> 2 using namespace std; 3 class Base 4 { 5 public: 6 Ba ...

  5. 关于flume中涉及到时间戳的错误解决,Expected timestamp in the Flume even

    在搭建flume集群收集日志写入hdfs时发生了下面的错误: java.lang.NullPointerException: Expected timestamp in the Flume event ...

  6. centos保存rpm到本地以及使用yum完全卸载软件包

    目录 保存安装的rpm到本地 方法一: 方法二(推荐): yum卸载软件包包括依赖 保存安装的rpm到本地 方法一: [root@ServerA ~]# vim /etc/yum.conf [main ...

  7. Docker Swarm(二)常用命令

    # 管理配置文件 docker config     # 查看已创建配置文件     - docker config ls     # 将已有配置文件添加到docker配置文件中     - dock ...

  8. linux基础之基础命令一

    本节内容: 1. ls:列出当前目录下的文件和目录 -l: 长输出,显示文件的详细信息(-普通文本,d目录) -a: 显示所有文件,包括隐藏文件 -h: 人类易读(-lh) -d: 显示目录信息(-l ...

  9. 【Java】Jackson解析xml的坑

    为了获取xml数据,在spring mvc中针对 @ResponseBody配置了jackson. 刚用的时候内心是狂喜的,终于不用自己解析了----  but----------还是有坑的-- 坑一 ...

  10. elk搜集日志,实现logstash根据message中结构不同动态创建索引并扩展功能,区分message中json和非json数据简单方式

    搜集日志,但是框架本身也会打印很多日志是字符串的.我们自己希望的日志用json,但是又需要json字段可以扩展,logstash收集日志后都放在了message字段中,我们自定义打印的是json串,s ...