Acitivity生命周期分析
2016-04-17 14:41
239 查看
今天周日在家有点无聊,打算复习一下基础知识,于是看了点关于acitivity生命周期的基础知识,打算和大家分享一下。
好了步入正题:
在正常情况下,Activity会经历如下7个生命周期(我数数有没有数错,~~哈哈~~):
1)onCreate:表示Activity正在创建,这是生命周期的第一个方法。一般我们会在这个方法中进行一些初始化的操作,例如setContentView去加载页面,初始化Acitivity的一些所需数据,一般项目中的BaseAcitivity都是在这个生命周期中调用一些抽象方法,将逻辑分离开的。
2)onRestart:表示Acitivity正在重新启动。一般情况下,是当前Acitivity从不可见变为可见状态时调用。例如,你按Home键回到桌面重新再打开这个Activity时,或者从当前Acitivity跳向另一个Acitivity然后回到当前Acitivity时。
3)onStart:表示Activity正在被启动,即将开始,这时Acitivity已经可见了,但是还没有出现在前台,还无法可以和用户交互。这个时候其实我们可以理解为Acitivity意见显示出来了,只是我们还看不到。
4)onResume:表示Activity已经可见了,并且出现在前台开始活动,要注意onStart和onResume都表示Acitivity'已经可见,但是onStart的时候Acitivity还在后台,而onResume的时候Acitivity'已经显示到前台,并且可以和用户进行交互。
5)onPause:表示Acitivity正在停止,正常情况下,会马上调用onStop,如果这个时候快速的回到当前Acitivity,那么onReSume会被调用。当然这中情况比较极端,用户很难重现这一场景。在这个生命周期中,我们可以做一些存储数据,停止动画等工作,但是注意不能太耗时,因为这会影响到新的Activity的显示,onPause必须先执行完,新的Acitivity的onResume才会执行。(这句话很重要,记住)
6)onStop:表示Acitivity即将停止活动,这时候我们可以做一些稍微重量级的回收工作,同样不能太耗时。
7)onDestory:表示Acitivity即将被销毁,这是Acitivity生命周期中的最后一个回调,在这里,我们可以做一些回收工作和释放一些资源。
具体过程如下图:
![](http://img.blog.csdn.net/20160417133442407?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
下面我们根据具体情况分析一下这个流程:
1.针对某一个特定的一个Acitivity,第一次启动时,回调如下:onCreate->onStart->onResume
2.打开新的Activity和或者切换到桌面的时候,回调如下:onPause->onStop。这里有种特殊情况,如果新的Acitivity采用 了透明主题,那么当前Acitivity不会回调onStop
3.当用户再次回到原Activity时,回调如下:onRestart->onStart->onResume.
4.当用户按back键回退时,回调如下:onPause->onStop-onDestory.
5.当Activity被系统回收后再次打开,生命周期回调过程和过程1是一样的。
这样我们先做一个小结:从整个生命周期来看,onCreate和onDestory是配对的,分别标志着Acitivity的创建和销毁,并且只可能有一次调用。从Acitivity是否可见来说,onStart和onStop是配对的,随着用户的操作或者设备屏幕的点亮和熄灭,这两个方法是可能被调用多次的。从Activity是否在前台来说,onResume和onPause是配对的,同样,随着用户的操作或者设备屏幕的点亮和熄灭,这两个方法是可能被调用多次的。
在这里提出一个问题:假设当前Acitivity为A,用户打开一个新的Acitivity B,那么这时候生命周期的回调过程是什么呢。
答案是 A的onPause->B的onCreate->B的onStart->B的onResume->A的onStop
为什么会这样呢,我们来简单分析一下,当A跳向B时,它首先会退出前台,所以它会先回调A的onPause,这个我们都可以理解,但是为什么没有马上回调A的onStop呢,我们可以从是否可见去理解,当我们去启动一个新的Acitivity时候,肯定是新的Acitivity全部显示出来,上一个Activity才会完全处于不可见状态,这样分析一下,是不是就理解了上面的回调过程,对2中不回调onStop也明白了呢。
上面的分析都是建立在正常的情况下,大家有没有想过在一些异常情况下,生命周期又是怎样的呢。
首先我们来了解一下什么是所谓的异常情况(可不包括你程序出了Bug 崩溃了(●'◡'●)):
情况1:资源相关的系统配置发生改变导致Acitivity被杀死并重新创建(例如横竖屏切换)
情况2:资源内存不足导致优先级的Acitivity被杀死
这时候生命周期如下图:
![](http://img.blog.csdn.net/20160417143725276?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
通过这个图是不是对在异常状况下,保存页面状态又有了新思路呢,好了今天就分析这么多了~~
好了步入正题:
在正常情况下,Activity会经历如下7个生命周期(我数数有没有数错,~~哈哈~~):
1)onCreate:表示Activity正在创建,这是生命周期的第一个方法。一般我们会在这个方法中进行一些初始化的操作,例如setContentView去加载页面,初始化Acitivity的一些所需数据,一般项目中的BaseAcitivity都是在这个生命周期中调用一些抽象方法,将逻辑分离开的。
2)onRestart:表示Acitivity正在重新启动。一般情况下,是当前Acitivity从不可见变为可见状态时调用。例如,你按Home键回到桌面重新再打开这个Activity时,或者从当前Acitivity跳向另一个Acitivity然后回到当前Acitivity时。
3)onStart:表示Activity正在被启动,即将开始,这时Acitivity已经可见了,但是还没有出现在前台,还无法可以和用户交互。这个时候其实我们可以理解为Acitivity意见显示出来了,只是我们还看不到。
4)onResume:表示Activity已经可见了,并且出现在前台开始活动,要注意onStart和onResume都表示Acitivity'已经可见,但是onStart的时候Acitivity还在后台,而onResume的时候Acitivity'已经显示到前台,并且可以和用户进行交互。
5)onPause:表示Acitivity正在停止,正常情况下,会马上调用onStop,如果这个时候快速的回到当前Acitivity,那么onReSume会被调用。当然这中情况比较极端,用户很难重现这一场景。在这个生命周期中,我们可以做一些存储数据,停止动画等工作,但是注意不能太耗时,因为这会影响到新的Activity的显示,onPause必须先执行完,新的Acitivity的onResume才会执行。(这句话很重要,记住)
6)onStop:表示Acitivity即将停止活动,这时候我们可以做一些稍微重量级的回收工作,同样不能太耗时。
7)onDestory:表示Acitivity即将被销毁,这是Acitivity生命周期中的最后一个回调,在这里,我们可以做一些回收工作和释放一些资源。
具体过程如下图:
下面我们根据具体情况分析一下这个流程:
1.针对某一个特定的一个Acitivity,第一次启动时,回调如下:onCreate->onStart->onResume
2.打开新的Activity和或者切换到桌面的时候,回调如下:onPause->onStop。这里有种特殊情况,如果新的Acitivity采用 了透明主题,那么当前Acitivity不会回调onStop
3.当用户再次回到原Activity时,回调如下:onRestart->onStart->onResume.
4.当用户按back键回退时,回调如下:onPause->onStop-onDestory.
5.当Activity被系统回收后再次打开,生命周期回调过程和过程1是一样的。
这样我们先做一个小结:从整个生命周期来看,onCreate和onDestory是配对的,分别标志着Acitivity的创建和销毁,并且只可能有一次调用。从Acitivity是否可见来说,onStart和onStop是配对的,随着用户的操作或者设备屏幕的点亮和熄灭,这两个方法是可能被调用多次的。从Activity是否在前台来说,onResume和onPause是配对的,同样,随着用户的操作或者设备屏幕的点亮和熄灭,这两个方法是可能被调用多次的。
在这里提出一个问题:假设当前Acitivity为A,用户打开一个新的Acitivity B,那么这时候生命周期的回调过程是什么呢。
答案是 A的onPause->B的onCreate->B的onStart->B的onResume->A的onStop
为什么会这样呢,我们来简单分析一下,当A跳向B时,它首先会退出前台,所以它会先回调A的onPause,这个我们都可以理解,但是为什么没有马上回调A的onStop呢,我们可以从是否可见去理解,当我们去启动一个新的Acitivity时候,肯定是新的Acitivity全部显示出来,上一个Activity才会完全处于不可见状态,这样分析一下,是不是就理解了上面的回调过程,对2中不回调onStop也明白了呢。
上面的分析都是建立在正常的情况下,大家有没有想过在一些异常情况下,生命周期又是怎样的呢。
首先我们来了解一下什么是所谓的异常情况(可不包括你程序出了Bug 崩溃了(●'◡'●)):
情况1:资源相关的系统配置发生改变导致Acitivity被杀死并重新创建(例如横竖屏切换)
情况2:资源内存不足导致优先级的Acitivity被杀死
这时候生命周期如下图:
通过这个图是不是对在异常状况下,保存页面状态又有了新思路呢,好了今天就分析这么多了~~
相关文章推荐
- Spring3 升级Spring 4
- OAuth2学习笔记(1)——简介
- 上海社区公共户办理
- css特殊图形绘制
- 线程同步与互斥 以及死锁问题
- windows下mysql中文乱码问题
- andriod view的子类
- Exception in thread "main" java.util.ConcurrentModificationExceptions
- 0008《SQL必知必会》笔记04-子查询、联接与组合查询
- 笔记
- 图论总结(一)
- 合并排序
- Mybatis最入门---数据库的下载与安装
- java-----ThreadLocal源码分析
- DNS服务正向、反向解析区域,主/从区域数据库复制,子域授权及基本安全控制
- crontab定时执行任务
- 关于CSS外边距叠加问题
- TCP/IP(二):数据链路层和网络层
- XCODE
- webView使用小技巧