Application生命周期(一)
1、Application是什么?
Application和Activity,Service一样,是android框架的一个系统组件,当android程序启动时系统会创建一个application对象
用来存储系统的一些信息。通常我们是不需要指定一个Application的,这时系统会自动帮我们创建
如果需要创建自己 的Application也很简单创建一个类继承 Application并在manifest的application标签中进行注册
(只需要给Application标签增加个name属性把自己的 Application的名字定入即可)。
Android系统会为每个程序运行时创建一个Application类的对象且只创建一个、可以理解为单例模式的一个类。
它的生命周期是整个程序运行中最长的 因为它是全局的单例,所以在不同的Activity和Service中获取的都是一个对象。
一般会使用Application来进行一些数据传递,数据缓存的操作。
2、Application生命周期
Application中包含了五个公开的方法
1)void onConfigurationChanged(Configuration newConfig)
2)void onCreate()
3)void onLowMemory()
4)void onTerminate()
5)void onTrimMemory()
第一个是在配置被改变时触发
第二个是在程序创建时创建
第三个内存不够时触发
第四个当终止程序时调用 但是不能保证一定调用
第五个是在内存清理时触发
3、实例展示
/**
* @author ljcheng
* @date 2019/6/29
*/
public class MyApplication extends Application { private static String TAG = "MyApplication"; @Override
public void onCreate() {
// 程序创建的时候执行
KLog.d(TAG, "onCreate");
super.onCreate();
} @Override
public void onTerminate() {
// 程序终止的时候执行
//当终止应用程序对象时调用,不保证一定被调用,当程序是被内核终止以便为其他应用程序释放资源,那
//么将不会提醒,并且不调用应用程序的对象的onTerminate方法而直接终止进程
KLog.d(TAG, "onTerminate");
super.onTerminate();
} @Override
public void onLowMemory() {
// 当后台程序已经终止资源还匮乏时会调用这个方法。好的应用程序一般会在这个方法里面释放一些不必
// 要的资源来应付当后台程序已经终止,前台应用程序内存还不够时的情况。
KLog.d(TAG, "onLowMemory");
super.onLowMemory();
} @Override
public void onTrimMemory(int level) {
// 程序在内存清理的时候执行
KLog.d(TAG, "onTrimMemory");
super.onTrimMemory(level);
} @Override
//配置改变时触发这个方法
public void onConfigurationChanged(Configuration newConfig) {
KLog.d(TAG, "onConfigurationChanged");
super.onConfigurationChanged(newConfig);
} }
四、总结一下
1.Application的生命周期在整个应用运行期间是最长的
2.具体关于Applicatiom被杀死的情况在上面的代码已有体现 下面引用下其他人总结的一些情况
备注:application 被杀死的情况分析:
为了决定在内存较低的时候杀掉哪个进程, Android会根据运行在这些进程内的组件及他们的状态把进程划分成一个”重要程度层次”. 其重要的程度按以下规则排序:
1:前端进程可以是一个持有运行在屏幕最前端并与用户交互的Activity的进程(onResume方法被调用时),也可以是持有一个正在运行的IntentReceiver(也就是说他正在执行自己的onReceiveIntent方法)的进程. 在系统中, 只会有少数这样的进程, 并且除非内存已经低到不够这些进程运行, 否则系统不会主动杀掉这些进程. 这时, 设备通常已经达到了需要内存整理的状态, 所以杀掉这些进程是为了不让用户界面停止响应.
2:可视进程是持有一个被用户可见, 但没有显示在最前端 (onPause方法被调用时) 的Activity的进程. 举例来说, 这种进程通常出现在一个前端Activity以一个对话框出现并保持前一个Activity可见时. 这种进程被系统认为是极其重要的, 并且通常不会被杀掉, 除非为了保持所有前端进程正常运行不得不杀掉这些可见进程.
3:服务进程是持有一个Service的进程, 该Service是由startService()方法启动的, 尽管这些进程用户不能直接看到, 但是通常他们做的工作用户是十分关注的(例如, 在后台播放mp3或是在后台下载 上传文件), 所以, 除非为了保持所有的前端进程和可视进程正常运行外, 系统是不会杀掉服务进程的.
4:后台进程是持有一个不再被用户可见的Activity(onStop()方法被调用时)的进程. 这些进程不会直接影响用户体验. 加入这些进程已经完整的,正确的完成了自己的生命周期(访问Activity查看更多细节), 系统会在为前三种进程释放内存时随时杀掉这些后台进程. 通常会有很多的后台进程在运行, 所以这些进程被存放在一个LRU列表中, 以保证在低内存的时候, 最近一个被用户看到的进程会被最后杀掉
5:空进程是没有持有任何活动应用组件的进程. 保留这种进程的唯一理由是为了提供一种缓存机制, 缩短他的应用下次运行时的启动时间. 就其本身而言, 系统杀掉这些进程的目的是为了在这些空进程和底层的核心缓存之间平衡整个系统的资源
新人学习中,如有不正确的地方还望大家谅解,欢迎评论指出问题。
Application生命周期(一)的更多相关文章
- ASP.NET 应用程序(Application)生命周期概述
原文:ASP.NET 应用程序(Application)生命周期概述 引用MSDN:ASP.NET 应用程序生命周期概述 本 主题概述应用程序生命周期,列出重要的生命周期事件,并描述如何编写适合应用程 ...
- [转]ASP.net Application 生命周期事件
生命周期事件和 Global.asax 文件 在应用程序的生命周期期间,应用程序会引发可处理的事件并调用可重写的特定方法.若要处理应用程序事件或方法,可以在应用程序根目录中创建一个名为 Global. ...
- 【IOS6.0 自学瞎折腾】(五)应用程序的启动过程和Application生命周期
一 :main函数入口 看下项目资源结构,其实程序的入口也是在main.m里面. #import <UIKit/UIKit.h> #import "BvinAppDelegate ...
- IOS Application生命周期
第一阶段 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *) ...
- Application生命周期
onCreate 在创建应用程序时创建 onTerminate 当终止应用程序对象时调用,不保证一定被调用,当程序是被内核终止以便为其他应用程序释放资源,那么将不会提醒,并且不调用应用程序的对象的on ...
- pageContext,request,session,application生命周期
equest是封装client端(也就是用户通过browser)提交的请求数据和属性的对象. response是封装web server端响应数据和属性的对象. 我们经常会将pageContext.r ...
- Android Application的使用及其生命周期
摘要: 1. Application的使用 2. Application的生命周期 ---------------------------------------------------- 工程代码: ...
- WebApp中的页面生命周期及路由管理
最近切换到一个新项目,使用的技术栈是Require+Backbone,鉴于对鞋厂webapp框架的了解,发现这个新项目有些缺陷,主要是单纯依赖Backbone造成的,也就是Backbone的好和坏都在 ...
- JAVA CDI 学习(2) - Scope 生命周期
在上一节中,我们已经知道了如何用@Inject实现基本注入,这一节研究Bean实例注入后的“生命周期”,web application中有几种基本的生命周期(不管哪种编程语言都类似) 1.Applic ...
随机推荐
- Codeforces 444A DZY Loves Physics(图论)
题目链接:Codeforces 444A DZY Loves Physics 题目大意:给出一张图,图中的每一个节点,每条边都有一个权值.如今有从中挑出一张子图,要求子图联通,而且被选中的随意两点.假 ...
- 怎样一步一步删除(linux & UNIX)环境下 oracle 11g 集群节点
Deleting a Cluster Node on Linux and UNIX Systems 1.确定要删除的节点,是否active,pinned $ olsnodes -s -t 假设 ...
- Python中 如何将一个字符串分成一个个字符
其实 一个字符串 实质也是 一个列表 就很简单了: a = ' for item in a: print(item) 打印结果: 121512 如果进而要统计字符出现的次数 , 那就很简单了.
- ZOJ 3726 RMQ + 二分法
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5072 区域赛真干的话题 通过率最高的一个问题 不到一半认为这OK 然后WA果 ...
- 用callgraph生成的函数调用关系图
Wu Zhangjin 创作于 2015/04/05 评论打赏 By Falcon of TinyLab.org 2015/04/03 1 故事缘由 源码分析是程序员离不开的话题.无论是研究开源项目, ...
- apt-spy 软件源更新
ebian上的apt-get是最快的软件安装方式,不过要用好apt-get,首先得需要找到最快的源,这样安装软件的时候才能获得好的速度,用起来才能得心应手. 有的源在用了一段以后,就会失效,这个时候, ...
- JS 中click和onclick的区别
1.onclick是绑定事件,告诉浏览器在鼠标点击时候要做什么 2.click本身是方法,作用是触发onclick事件,只要执行了元素的click()方法,就会触发onclick事件
- C# 获得设备usb信息
原文:C# 获得设备usb信息 本文告诉大家如何获得设备的usb来进行判断是否有哪些usb和找不到usb可能是什么. 需要在项目右击引用,点击程序集,搜索 System.Management 然后安装 ...
- VS2012 调试Web项目 遭遇 HTTP 错误 500.23 - Internal Server Error
原文:VS2012 调试Web项目 遭遇 HTTP 错误 500.23 - Internal Server Error 在使用vs2012 调试Web站点时 报错 500.23,详细如图 此错误是因为 ...
- 微信小程序把玩(三十三)Record API
原文:微信小程序把玩(三十三)Record API 其实这个API也挺奇葩的,录音结束后success不走,complete不走,fail也不走, 不知道是不是因为电脑测试的原因,只能等公测或者等他们 ...