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 ...
随机推荐
- 本地Markdown上传图片
本地Markdown上传图片 1.上传本地markdown文件到博客园 使用工具pycnblog 下载:https://github.com/dongfanger/PyCnblog 查看READ ME ...
- [BUAA2021软工助教]结对项目-第二阶段小结
一.作业链接 结对项目-第二阶段 二.优秀作业推荐 本次博客作业虽然是简单总结,但是以下作业中都不乏有思考.有亮点的精彩内容,推荐给同学们阅读学习. 磨练,结对编程!(中) zzx 和 zzy 同学实 ...
- 详解Redis中两种持久化机制RDB和AOF
redis是一个内存数据库,数据保存在内存中,但是我们都知道内存的数据变化是很快的,也容易发生丢失.幸好Redis还为我们提供了持久化的机制,分别是RDB(Redis DataBase)和AOF(Ap ...
- NAG博客目录
一.Scrum Meeting 1. Alpha Scrum meeting 1 Scrum meeting 2 Scrum meeting 3 Scrum meeting 4 Scrum meeti ...
- ROS之初见Hello World
前言 最近在玩ROS,笔记中断了一段时间. ROS即Robot Operating System,机器人操作系统,是一个开源框架,主力语言是C++和python,提供了硬件抽象.设备驱动.库函数.可视 ...
- [c++] 子类构造函数中有默认参数
子类创建对象时调用父类的构造函数: 1 #include <iostream> 2 using namespace std; 3 class Base 4 { 5 public: 6 Ba ...
- 【转载】使用rdp协议访问远程Linux桌面
使用rdp协议访问远程Linux桌面 2017年03月31日 16:23:49 太阳之影 阅读数:2169 一般情况下,如果需要登陆远程Linux系统,我们会使用ssh/telnet来完成,如果需 ...
- 007.Python循环语句while循环嵌套
1 使用两个循环打印十行小星星 j = 0 while j<10: # 打印一行十个小星星 i = 0 while i<10: print("*",end=" ...
- OpenStack挂载ISO镜像解决
OpenStack挂载ISO镜像解决 Summary 本次在OpenStack平台上进行,基于kvm,挂载iso镜像到OpenStack虚拟机中. 1.针对linux: 上传所需要挂载的iso镜像(必 ...
- S6 文件备份与压缩命令
6.1 tar:打包备份 6.2 gzip:压缩或解压文件 6.3-4 zip.unzip 6.5 scp:远程文件复制 6.6 rsync:文件同步工具