四大组件中Activity那点事

四大组件中的基本概念已经在之前的一篇文章里面提到了,现在就不再赘述(其实后面想想,查阅起来会特别的麻烦,于是还是补充一下好)
Activity:
Activity 是一个负责与用户交互的组件,Activity 中所有操作都与用户密切相关,可以通过 setContentView(View)来显示指定控件。
在一个 android 应用中,一个 Activity 通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。

首先是笔试,面试中经常会被考到的生命周期(先上官方图):


060009291302389.png

下面是对各方法的解释:
onCreate(Bundle savedInstanceState):
创建 activity 时调用。设置在该方法中,还以 Bundle 的形式提供对以前储存的任何状态的访问!
onStart():
activity 变为在屏幕上对用户可见时调用。
onResume(): activity 开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法总是被调用的)。
onPause():
activity 被暂停或收回 cpu 和其他资源时调用,该方法用于保存活动状态的,也是保护现场,压栈吧!
onStop():
activity 被停止并转为不可见阶段及后续的生命周期事件时调用。
onRestart():
重新启动 activity 时调用。该活动仍在栈中,而不是启动新的活动。
onDestroy():
activity 被完全从系统内存中移除时调用,该方法被调用

图中需要注意一下几点:

1.Activity实例是由系统自动创建,并在不同的状态期间回调相应的方法。一个最简单的完整的Activity生命周期会按照如下顺序回调:onCreate -> onStart -> onResume -> onPause -> onStop -> onDestroy。称之为entire lifetime。

2.当执行onStart回调方法时,Activity开始被用户所见(也就是说,onCreate时用户是看不到此Activity的,那用户看到的是哪个?当然是此Activity之前的那个Activity),一直到onStop之前,此阶段Activity都是被用户可见,称之为visible lifetime。

3.当执行到onResume回调方法时,Activity可以响应用户交互,一直到onPause方法之前,此阶段Activity称之为foreground lifetime。

Acitivity一般意义上有四种状态:

1.当Activity位于栈顶时,此时正好处于屏幕最前方,此时处于运行状态;

2.当Activity失去了焦点但仍然对用于可见(如栈顶的Activity是透明的或者栈顶Activity并不是铺满整个手机屏幕),此时处于暂停状态;

3.当Activity被其他Activity完全遮挡,此时此Activity对用户不可见,此时处于停止状态;

4.当Activity由于人为或系统原因(如低内存等)被销毁,此时处于销毁状态;

假设A Activity位于栈顶,此时用户操作,从A Activity跳转到B Activity,实际应用场景中调用的方法以及调用的顺序:
开始时,A被实例化,执行的回调有A:onCreate -> A:onStart -> A:onResume。

当用户点击A中按钮来到B时,假设B全部遮挡住了A,将依次执行A:onPause -> B:onCreate -> B:onStart -> B:onResume -> A:onStop。

此时如果点击Back键,将依次执行B:onPause -> A:onRestart -> A:onStart -> A:onResume -> B:onStop -> B:onDestroy。

至此,Activity栈中只有A。在Android中,有两个按键在影响Activity生命周期这块需要格外区分下,即Back键和Home键。我们先直接看下实验结果:

此时如果按下Back键,系统返回到桌面,并依次执行A:onPause -> A:onStop -> A:onDestroy。

此时如果按下Home键(非长按),系统返回到桌面,并依次执行A:onPause -> A:onStop。由此可见,Back键和Home键主要区别在于是否会执行onDestroy。

如何退出 Activity ? 如何安全退出已调用多个
Activity 的 Application?
在 Android 中退出程序比较麻烦,尤其是在多个 Activity 的程序中,在 2.2 之前可以采用如下代码退出程序:

图片.png

此种方法是一种最方便和最简单的退出程序的办法,但是在 2.2 和 2.2 之后就不能用了
一种常用的方法是自定义一个 Activity 的栈,在程序退出时将栈中的所有的 Activity 进行 finish。
还有一些其他的方式,在这可查看
http://alex-yang-xiansoftware-com.iteye.com/blog/1099207

后台的 Activity 由于某原因被系统回收,在被系统回收之前保存当前状态
重写 onSaveInstanceState()方法,在此方法中保存需要保存的数据,该方法将会在 activity 被回收之前调用。通过重写 onRestoreInstanceState()方法可以从中提取保存好的数据

activity 在屏幕旋转时的生命周期:
不设置 Activity 的 android:configChanges 时,切屏会重新调用各个生命周期, 切横屏时会执行一次,切竖屏时会执行两次;
设置 Activity 的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期, 切横、竖屏时只会执行一次;
设置 Activity 的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行 onConfigurationChanged 方法。

activity 的启动模式:

  1. Standared 模式(默认)
    

我们平时直接创建的 Activity 都是这种模式的 Activity,这种模式的 Activity 的特点是:只要你创建了 Activity 实例,一旦激活该 Activity,则会向任务栈中加入新创建的实例, 退出 Activity 则会在任务栈中销毁该实例。

  1. SingleTop 模式
    这种模式会考虑当前要激活的 Activity 实例在任务栈中是否正处于栈顶,如果处于栈顶则无需重新创建新的实例,会重用已存在的实例,否则会在任务栈中创建新的实例。
  2. SingleTask 模式
    如果任务栈中存在该模式的Activity 实例,则把栈中该实例以上的Activity 实例全部移除, 调用该实例的 newInstance()方法重用该 Activity,使该实例处於栈顶位置,否则就重新创建一个新的 Activity 实例。
  3. SingleInstance 模式
    当该模式 Activity 实例在任务栈中创建后,只要该实例还在任务栈中,即只要激活的是该类型的 Activity,都会通过调用实例的 newInstance()方法重用该 Activity,此时使用的都是同一个 Activity 实例,它都会处于任务栈的栈顶。此模式一般用于加载较慢的,比较耗性能且不需要每次都重新创建的 Activity。

跟 activity 和 Task 有关的 Intent 启动方式:

  1. FLAG_ACTIVITY_NEW_TASK
    如果设置,这个 Activity 会成为历史 stack 中一个新 Task 的开始。一个 Task(从启动它的 Activity 到下一个 Task 中的 Activity)定义了用户可以迁移的Activity 原子组。Task 可以移动到前台和后台;在某个特定 Task 中的所有 ActivityNormal总是保持相同的次序。这个标志一般用于呈现“启动”类型的行为:它们提供用户一系列可以单独完成的事情,与启动它们的 Activity 完全无关。

2.FLAG_ACTIVITY_CLEAR_TOP
如果设置,并且这个 Activity 已经在当前的 Task 中运行,因此,不再是重新启动一个这个 Activity 的实例,而是在这个 Activity 上方的所有 Activity 都将关闭, 然后这个 Intent 会作为一个新的 Intent 投递到老的 Activity(现在位于顶端)中。

3.FLAG_ACTIVITY_SINGLE_TOP
如果设置,并且这个 Activity 已经在当前的 Task 中运行,因此,不再是重新启动一个这个 Activity 的实例,而是在这个 Activity 上方的所有 Activity 都将关闭,然后这个Intent 会作为一个新的 Intent 投递到老的 Activity(现在位于顶端)中。

4.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
如果设置这个标志,这个 activity 不管是从一个新的栈启动还是从已有栈推到栈顶,它都将以 the front door of the task 的方式启动。这就将导致任何与应用相关的栈都讲重置到正常状态(不管是正在将 activity 移入还是移除),如果需要,或者直接重置该栈为初始状态。

以上大概就是的关于Activity的一些知识点,关于生命周期一般都是会经常被问到,所以需要重点记忆

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

推荐阅读更多精彩内容