简述Android Activity

目录:
[TOC]

1、生命周期方法

  • onCreate()
    触发时机:当Activity第一次启动的时候。
    作用:完成Activity的初始化工作(包括视图的创建,数据的绑定等等)。
    注意:该方法的参数(Bundle savedInstanceState),savedInstanceState是通过调用onSaveInstanceState()保存下的状态信息。如果它为null,系统则是创建一个新的Activity实例,而不是恢复之前被Destory的Activity。

  • onRestart()
    触发时机:当处于停止状态的Activity需要再次展现给用户的时候。
    执行时机:在onCreate()之后,onStart()之前执行。
    作用:执行一些特殊的恢复(restoration)工作,请注意之前是被stopped而不是destrory。

  • onStart()
    触发时机:所属活动将被展现给用户。
    作用:比较好的地方来验证某些必须的系统特性是否可用,例如广播等。 onStop()里面做了哪些清除的操作,就该在onStart()里面重新把那些清除掉的资源重新创建出来。

  • onResume()
    触发时机:当Activity和用户发生交互的时候。
    作用:初始化那些在onPause()方法里面释放掉的组件,并执行那些activity每次进入onResume()都需要的初始化动作 (例如开始动画与初始化那些只有在获取用户焦点时才需要的组件)。

  • onPause()
    触发时机:当一个Activity失去系统焦点后,当另一个Activity启动时或返回前一个Activity时。
    作用:停止动画或者是其他正在运行的操作,那些都会导致CPU的浪费;
    提交在用户离开时期待保存的内容(例如邮件草稿);释放系统资源,例如broadcast receivers, sensors (比如GPS), 或者是其他任何会影响到电量的资源。
    注意:无论什么原因导致Activity停止,系统总是会在onStop()之前调用onPause()方法。

  • onStop()
    触发时机:当一个Activity不再需要展示给用户的时候。
    作用:Activity不再可见,并且应该释放那些不再需要的所有资源,从而避免内存泄漏。
    注意:如果内存紧张,系统会直接结束这个Activity,而不会触发 onStop 方法。 所以保存状态信息是应该在onPause时做,而不是onStop时做。在一些情况下,onPause方法或许是Activity触发的最后的方法,因此需要在这个时候保存需要保存的信息。

  • onDestory()
    触发时机:当Activity销毁的时候。
    作用:最后去清除那些可能导致内存泄漏的地方。因此需要确保那些线程都被destroyed并且所有的操作都被停止。
    注意:onDestory()和 onStop()一样,如果内存紧张,系统会直接结束这个活动而不会触发该方法。

  • onRestoreInstanceState()
    触发时机:只有在Activity销毁重建的时候。
    执行时机:会在onStart()和onResume()之间执行。
    作用:恢复异常关闭时保存的数据。

  • onSaveInstanceState()
    触发时机:当跳转Activity或应用遇到意外情况(内存不足,用户直接按home键)由系统直接销毁Activity时。
    执行时机:会在onPause()或onStop()之前执行。
    作用:系统调用该方法,允许Activity保存之前的状态,例如:EditText 组件中的文本或 ListView 的滑动位置。

2、生命周期的三种分类

  1. 完整生命周期(Entire lifetime)
    onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDestroy()
  2. 可见生命周期(Visible lifetime)
    onStart() -> onResume() -> onPause() -> onStop()
  3. 前台生命周期(Foreground lifetime)
    onResume() -> onPause()

3、生命周期方法启动顺序

  1. 常规启动
    onCreate()—>onStart()—>onResume()
  2. 当另一个Activity启动时
    Activity_1 onPause() —>
    Activity_2 onCreate() —> onStart() —> onResume() —>
    Activity_1 onStop()
  3. 当返回到之前Activity时
    Activity_2 onPause() —>
    Activity_1 onRestart() —> onStart() —> onResume() —>
    Activity_2 onStop() —> onDestroy()

4、生命周期方法销毁顺序

  1. 异常销毁
    onPause() —> <Process Killed>
  2. 异常销毁
    onPause() —> onStop() —> <Process Killed>
  3. 正常销毁
    onPause() —> onStop() —> onDestroy()

5、Activity的四种状态

  1. 活动状态(Runing)
    处于栈顶,处于可见并可和用户交互的激活状态。
    活动状态触发的函数及顺序为:
    onCreate() —> onStart() —> onResume()。
  2. 暂停状态(Paused)
    当 Activity 被另一个透明或者 Dialog 样式的 Activity 覆盖时的状态。此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它仍然可见,但它已经失去了焦点故不可与用户交互。
    活动状态到暂停状态所触发的函数及顺序为:
    onResume() —> onPuased()。
    暂停状态恢复至活动状态所触发的函数及顺序为:
    onPuased() —> onResume()。
  3. 停止状态(Stoped)
    当 Activity 被另外一个 Activity 覆盖、失去焦点并不可见时处于 Stoped 状态。
    暂停状态到停止状态所触发的函数及顺序为:
    onPuased() —> onStop()。
    停止状态恢复至活动状态所触发的函数及顺序为:
    onStop() —> onRestart() —> onStart() —> onResume()。
  4. 死亡状态(Killed)
    Activity 被系统杀死回收或者没有被启动时处于 Killed 状态。
    停止状态到死亡状态分为两种情况:
    情况一:由用户操作导致,则执行onStop() —> onDestroy()。
    情况二:由系统自动强制执行,则该Activity被强行结束。

6、Back键与Home键区别

  • Back键
    默认行为是finish处于前台的Activity,即Activity的状态为Destroy状态为止,若再次启动该Activity是从 onCreate()开始,不会调用onSaveInstanceState()。
  • Home键
    默认行为是Stop处于前台的Activity,即Activity的状态为Stop状态为止,而不是Destroy。
    若再次启动该Activity,会调用onSaveInstanceState() 方法,保持上次Activity的状态则是从OnRestart() —> onStart() —> onResume()。

7、Activity中数据保存与恢复

  • 保存数据
    onPause(),onSaveInstance(bundle)。
  • 恢复数据
    onCreate(Bundle), onRestoreInstanceState(budle)。
    默认情况下onSaveInstanceSate()和onRestoreInstanceState()会对UI状态进行保存和恢复,如果需要保存其他数据可以在onSaveInstanceState(),onPause()保存。
    注意:如果是持久化的数据得通过onPause()保存(google推荐)。

8、Activity的加载模式

  • 设置加载模式的两种方法

    1. Intent对象中设置的Flag;
    2. AndroidManifest.xml中进行设置,launchMode属性。
  • 四种加载模式

    1. standard
      默认模式,可以不用写配置。可以有多个相同的实例,也允许多个相同Activity叠加。
    2. singleTop
      可以有多个相同的实例,但不允许多个相同Activity叠加。即,如果Activity在栈顶的时候,启动相同的Activity,不会创建新的实例,而会调用其onNewIntent方法。
    3. singleTask
      只有一个实例。启动时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。如果在别的应用程序中启动它,则会新建一个task,并在该task中启动这个Activity,并且允许别的Activity与其在一个task中共存。
    4. singleInstance
      只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。

9、Activity的栈管理

链接1
链接2

10、典型问题及解决方案

  • 屏幕旋转Activity销毁重建
    1. 不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次。
    2. 设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次。
    3. 在Android3.2之前,设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。但在Android3.2及其之后,仍会重新调用各个生命周期一次,因为screen size也开始跟着设备的横竖切换而改变。
    4. Android3.2及其之后,设置Activity的android:configChanges=”orientation|keyboardHidden|screenSize“,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。
    5. 解决方案链接
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容

  • Activity https://developer.android.com/guide/components/a...
    XLsn0w阅读 703评论 0 4
  • 本文出自 “阿敏其人” 简书博客,转载或引用请注明出处。 一、前言 Activity,安卓四大组件之一。 每个 A...
    阿敏其人阅读 9,092评论 8 88
  • 这是一篇算不上书评的书评。或者,我只想跟你谈谈这本书。 国庆节的最后一天,我请了一天假跑到新华书店(我们国庆不放假...
    我的老师是只猫阅读 416评论 6 5
  • 读《尘埃落定》有感 最近读了一本书《尘埃落定》,开始毫无兴趣,但听说好评不断,且是茅盾文学奖得主,忍不住好奇...
    王栎涵阅读 193评论 0 2
  • 1. 云海的边缘没有光,退潮时,会露出一片深蓝色的海岸,这是一片环形的海岸,从一个地方出发沿岸行走,走上一夜就会返...
    小萘阅读 382评论 2 9