Activity的生命周期

概述:

Activity是Android的四大组件之一。是用户操作的可视化界面;它为用户提供了一个完成操作指令的窗口。当我们创建完毕Activity之后,需要调用setContentView()方法来完成界面的显示;以此来为用户提供交互的入口。在Android App 中只要能看见的几乎都要依托于Activity,所以Activity是在开发中使用最频繁的一种组件。在这里作为新手总结了一下Activity的生命周期。

1.生命周期介绍:

onCreate();

该方法在Activity被创建时调用,它是Activity的生命周期第一个调用方法,我们在创建Activity的时候一般都会重写此方法,并在该方法中执行一些初始化操作。

onRestart();

该方法在Activity重新被启动的时候执行,这时候Activity会从不可见变为可见状态,比较常见的情况是当前Activity 上面打开了一个新的Activity 然后关闭新的Activity 回到原来Activity的时候,便会重新启动Activity执行这个方法。

onstart()

该方法表示此时Activity正在启动,但是还没有在前台显示,当该方法执行完成时,Activity已经启动可见,但是还不能与用户交互。

onResume();

该方法被调用时,Activity已经可以跟用户进行交互,并且此时Activity已经显示在前台。

onPause();

这个方法表示Activity正在停止,一般来说在onPause()执行之后会立刻回调onstop()方法。但是也有例外,这里举一个栗子,比如,Activity 去启动一个完全透明的Activity时,此时执行了onPause(),但是不会去执行onStart();该方法中一般不要执行比较耗时的操作。因为新的Activity的onResume()方法会在启动它的Activity 的OnPause()执行完成之后才会去执行。

onStop();

这个方法在Activity完全不可见的时候调用。它和onPause()方法的主要区别在于,如果启动的新Activity是一个对话框式的activity,那么,onPause()方法会得到执行,而onStop()方法并不会执行。

onDestroy();

 这个方法在Activity被销毁之前调用,之后Activity的状态将变为销毁状态。一般在这个方法中做一些资源释放的操作。

2.Activity的几种生命周期

说到Activity的生命周期,我们首先想到的是Activity正常的生命周期,但是在非正常情况下Activity的生命周期又会有所不同,这里简单介绍两种情况。这里有一张经典的生命周期流程图。


<1.正常生命周期

activity启动:

在正常情况下,生命周期为:onCreate() >onStart()>onResume();

activity关闭:

在正常情况下,生命周期为:onPause()>onStop()>onDestroy;

横竖屏切换时:

onPause()>onStop()>onDestroy()>onCreate()>onStart()>onResume();

Activity A跳转到Activity B时的生命周期变化:

A onCreate()>A onStart()> A onResume() > A onPause()>B onCreate() >B onStart() >B onResume() > A onStop();

可以看到 当A的onPause()执行之后会立即开始B的生命周期运行,所以在onPause() 中执行耗时操作,会影响B 的启动速度。

<2.异常生命周期

简介:异常生命周期这里指的就是Activity非正常关闭时出现的生命周期,下面两种情况会出现:

1.旋转屏幕(资源相关的系统配置改变)

2.Activity被GC杀死回收

这里除了上面的生命周期外,还会有两个方法,Android 为了解决这种异常情况,专门有方法进行数据的保存和读取。

(1)onSaveInstanceState(Bundle outState)

这个方法用来保存

(2)onRestoreInstanceState(Bundle savedInstanceState)

这个方法用来读取

举个栗子:我们重写这两个方法

@Override 

protected void onSaveInstanceState(Bundle outState) {

super.onSaveInstanceState(outState);

outState.putString("date", "这里有我们存储的数据");

Log.d("TAG", "onSaveInstanceState" + outState.toString());

 }


@Override

protected void onRestoreInstanceState(Bundle savedInstanceState) {

super.onRestoreInstanceState(savedInstanceState);

Log.d("TAG", "onRestoreInstanceState" + savedInstanceState.getString("date"));

}

当我们横屏切换时 :


日志打印结果

当然,我们经常使用的控件,例如Edittext,Android 已经帮我们做完了保存和回复,当我们界面中有Edittext的时候,填入数据,切换横屏,会发现Edittext中输入的数据并没有丢失。不过我们如果有列表,或者其他数据还是需要自己去完成保存,因为转屏时Activity销毁后 然后启动了。

3.Activity的几种状态

首先了解一下Android用来管理Activity的栈。

Android 返回栈:

Android是使用任务(Task)来管理Activity的,一个任务就是一组存放在栈里的Activity集合,被称为返回栈,栈是一种先进后出的数据结构。

常见的数据结构:先进先出-如队列,先进后出如栈


队列


堆栈

Active/Running: 

Activity处于活动状态,此时Activity处于栈顶,是可见状态,可与用户进行交互。 

Paused: 

当Activity失去焦点时,或被一个新的非全屏的Activity,或被一个透明的Activity放置在栈顶时,Activity就转化为Paused状态。但我们需要明白,此时Activity只是失去了与用户交互的能力,其所有的状态信息及其成员变量都还存在,只有在系统内存紧张的情况下,才有可能被系统回收掉。 

Stopped: 

当一个Activity被另一个Activity完全覆盖时,被覆盖的Activity就会进入Stopped状态,此时它不再可见,但是跟Paused状态一样保持着其所有状态信息及其成员变量。 

Killed: 

当Activity被系统回收掉时,Activity就处于Killed状态。 

Activity会在以上四种形态中相互切换,至于如何切换,这因用户的操作不同而异。

4.补充:

onWindowFocusChanged()

该方法在Activity 获取焦点和失去焦点的时候会被调用,我们也可以认为是当Activity完全加载之后会调用该方法,而在activity 关闭时,在执行了onPause之后 会调用该方法,也就是onPause Activity失去焦点之后 不能与用户交互了。

如果之前你写过FrameAnimation你会发现,当我们在onCreate内start动画时,Activity启动了但并没有动画的效果,如果你将start放在onWindowFocusChanged内就会达到预期的效果了。这是因为在onCreate的时候Activity并没有获得焦点,而onWindowFocusChanged是在Activity获得焦点之后调用。

结论:

Activity生命周期的掌握,相信对每一位Android 开发人员都非常重要,能让我们在对应的生命周期中做适当的操作,Activity作为Android的四大控件之一,毋容置疑是必须掌握的。祝各位Android 开发者 技术越来越好,本人菜鸟,如果有什么写错的地方,欢迎大家指出。

本文参考了:

Activity生命周期全面总结

Android之Activity生命周期浅析(一)

Android技能树 — Activity小结   (写的超级棒)

彻底弄懂Activity四大启动模式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容