Android系统编程入门系列之应用初始化Application
在上一篇文章中我们了解到Android系统启动应用的时候,会首先加载AndroidManifest.xml清单文件中的一系列信息,在清单文件中如果不指定<application></application>标签中的name属性值,会默认使用android.app.Application作为应用程序加载类,其生命周期与应用程序生命周期是一致的。那么到底应用程序有怎样的生命周期,在不同的生命周期有哪些调用方法可以使用?这章将详细介绍。
生命周期
应用实例化
首先要知道,一个应用程序,有且仅有一个android.app.Application类与之对应,如果想在清单文件中使用自定义的Application,也必须是继承自android.app.Application的子类。Application的实例在Android系统启动应用时优先于应用中其他任何类而创建。
应用加载运行环境
由于Applicaiton是android.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的更多相关文章
- Android系统编程入门系列之加载界面Activity
上回说到应用初始化加载及其生命周期,在Android系统调用Applicaiton.onCreate()之后,继续创建并加载清单文件中注册的首个界面即主Activity,也可称之为入口界面.主Acti ...
- Android系统编程入门系列之应用环境及开发环境介绍
作为移动端操作系统,目前最新的Android 11.0已经发展的比较完善了,现在也到了系统的整理一番的时间,接下来的系列文章将以Android开发者为中心,争取用归纳总结的态度对初级入门者所应 ...
- Android系统编程入门系列之界面Activity响应多元的属性动画
在响应丝滑动画一篇文章中,分别介绍了作用于普通视图.绘制视图的绘制对象.和界面这三种对象的动画效果,但是都有一些使用的局限性.比如这些动画都只是以屏幕上绘制更新的方式绘制动画,并没有真实改变作用对象的 ...
- Android系统编程入门系列之加载服务Service
之前几篇文章简单梳理了在Android系统的四大组件之一,最主要的界面Activity中,使应用程序与用户进行交互响应的相关知识点,那对于应用程序中不需要与用户交互的逻辑,又要用到哪些内容呢?本文开始 ...
- Android系统编程入门系列之服务Service齐头并进多线程任务
在上篇文章中初步了解了Android系统的四大组件之一的服务Service,在服务内可以执行无用户交互的耗时操作任务,但是包括之前关于界面系列文章在内,生命周期方法都是在主线程内被系统回调的.如果直接 ...
- Android系统编程入门系列之界面Activity绘制展示
上篇文章介绍了界面Activity的启动方式和生命周期,本篇将继续介绍在界面Activity中的内容是如何绘制展示给用户的. 在Android系统上运行新创建的界面Activtiy,给用户展示的是空白 ...
- Android系统编程入门系列之界面Activity交互响应
在上篇文章中已经了解到界面Activity的绘制完全依赖其加载的视图组件View,不仅如此,用户的每次触摸操作都可以在界面Activity内接收并响应,也可以直接传递给其中的某个视图View响应.本文 ...
- Android系统编程入门系列之界面Activity响应丝滑的传统动画
上篇文章介绍了应用程序内对用户操作响应的相关方法位置,简单的响应逻辑可以是从一个界面Activity跳转到另一个界面Activity,也可以是某些视图View的相对变化.然而不管是启动一个界面执行新界 ...
- Android系统编程入门系列之服务Service中的进程间通信
在上篇文章以线程间的通信方式Handler类结尾,服务Service还支持的进程间通信,又是具体怎么实现的呢?这就要用到加载服务一文中提到的AIDL语言规范了. AIDL是 Android Inter ...
随机推荐
- C#如何加载嵌入到资源的非托管dll
如何加载非托管Dll 我们总会遇到需要加载非Win32的非托管dll,这里推荐一种方式就是将那些非win32的非托管dll嵌入资源的方式,在入口解压并且加载的方式,我先来看看如何实现吧,首先我们准备好 ...
- QFNU 10-02 19 training
B - Yet Another Crosses Problem 题意:找如果使图中某一行某一列全部变成黑色,至少需要把多少个白方格变成黑方格 思路:直接找就可以,注意存储的时候要记得进行分开存储,存储 ...
- Envoy:离群点检测 outlier detection
outlier detection 在异常检测领域中,常常需要决定新观察的点是否属于与现有观察点相同的分布(则它称为inlier),或者被认为是不同的(称为outlier).离群是异常的数据,但是不一 ...
- CentOS/Linux内存占用大,用Shell脚本自动定时清除/释放内存
CentOS/Linux内存占用大,用Shell脚本自动定时清除/释放内存来自:互联网 时间:2020-03-22 阅读:114以下情况可能造成Linux内存占用过高服务配置存在直接分配错误,或隐性分 ...
- mysql基础之mariadb概念
一.数据库介绍 什么是数据库(Database)? 简单的说,数据库就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织,存储的,我们可以通过数据库 ...
- RSA算法在Python Django中的简单应用
说明 RSA算法是当今使用最广泛,安全度最高的加密算法. • RSA算法的安全性理论基础 [引]根据百科介绍,对极大整数做因数分解的难度决定了RSA算法的可靠性.换言之,对一极大整数做因数分解愈困难, ...
- Linux系统编程【5】——stty的学习
从文件的角度看设备 之前几篇文章介绍的编程是基于文件的.数据可以保存在文件中,也可以从文件中取出来做处理,再存回去.不仅如此,Linux操作系统还专门为这个东西建立了一套规则,就是前期介绍的" ...
- 用navigation的大致图
- 【Azure 事件中心】为应用程序网关(Application Gateway with WAF) 配置诊断日志,发送到事件中心
问题描述 在Application Gateway中,开启WAF(Web application firewall)后,现在需要把访问的日志输出到第三方分析代码中进行分析,如何来获取WAF的诊断日志呢 ...
- SQL Server 50道查询训练题,学生Student表
下面这个是题目所用到的数据库! 首先你需要在你的SQL Sever数据库中创建[TestDb]这个数据库,接下来下面这个代码.直接复制在数据库里运行就好了! 1 USE [TestDb] 2 GO 3 ...