四大组件-----Activity详解

关于Activity

引用google官方文档,是这么说的:

Activity
是一个应用组件,用户可与其提供的屏幕进行交互,以执行拨打电话、拍摄照片、发送电子邮件或查看地图等操作。 每个 Activity 都会获得一个用于绘制其用户界面的窗口。窗口通常会充满屏幕,但也可小于屏幕并浮动在其他窗口之上。

Activity是整个应用的基础,也是最基本的组件,一个应用通常由多个彼此松散联系的 Activity 组成。
关于Activity,我们需要了解以下几部分内容:

1.生命周期

关于生命周期,涉及的方法主要有下面七个:
onCreate()
首次创建 Activity 时调用。 您应该在此方法中执行所有正常的静态设置 — 创建视图、将数据绑定到列表等等。 系统向此方法传递一个 Bundle 对象,其中包含 Activity 的上一状态(前提是捕获了该状态)。始终后接 onStart()。
onRestart()
当前Activity已经创建,但是处于后台不可见状态(onStop已经执行),再次启动时调用。始终后接 onStart()。
与其他方法不同的是,onRestart()在整个生命周期中不是必定执行的方法。
onStart()
在 Activity 即将对用户可见之前调用。
如果 Activity 转入前台,则后接 onResume(),如果 Activity 转入隐藏状态,则后接 onStop()
onResume()
在 Activity 即将开始与用户进行交互之前调用。 此时,Activity 处于 Activity 堆栈的顶层,并具有用户输入焦点。
始终后接 onPause()。
onPause()
当系统即将开始继续另一个 Activity 时调用。 此方法通常用于确认对持久性数据的未保存更改、停止动画以及其他可能消耗 CPU 的内容,诸如此类。 它应该非常迅速地执行所需操作,因为它返回后,下一个 Activity 才能继续执行。
如果 Activity 返回前台,则后接 onResume(),如果 Activity 转入对用户不可见状态,则后接 onStop()。
onStop()
在 Activity 彻底对用户不可见的时候调用。
如果 Activity 恢复与用户的交互,则后接 onRestart(),如果 Activity 被销毁,则后接 onDestroy()。
onDestroy()
在 Activity 被销毁前调用。这是 Activity 将收到的最后调用。 当 Activity 结束(有人对 Activity 调用了 finish()
),或系统为节省空间而暂时销毁该 Activity 实例时,可能会调用它。 您可以通过isFinishing() 方法区分这两种情形。

因此,按照Activity的状态,生命周期分为三个部分,完整周期(onCreate到onDestroy),可见周期(onStart到onStop),前台周期(onResume到onPause)。系统会根据Activity所处的状态来决定调用的方法。

2.保存Activity状态

当 Activity 暂停或停止时,Activity 的状态会得到保留,是如何操作的呢?主要用到这个方法:
onSaveInstanceState()
那么,什么时候会调用该方法?简言之,在Activity即将处于可能被销毁的状态时(非用户主动销毁,比如按下back键)。按下home键,电源键,启动新的Activity以及横竖屏切换等。
该方法调用一定在onStop之前,可能在onPause之前。
调用该方法的时候,系统会向此方法传递一个Bundle,用来保存重要的数据,以便重建的时候恢复状态。在重建Activity时,该Bundle会传递给onCreate和onRestoreInstanceState,可以在这两个方法中恢复状态。
onRestoreInstanceState()
该方法调用时处于Create和Start之后,除非Activity确实被销毁了,重建时才会调用该方法,否则不会调用。
另外,横竖屏切换的时候有些特殊,默认情况下,横竖屏切换时,当前Activity会销毁然后重建。
也就是说,执行顺序会是这样子:
Pause→SaveInstanceState→Stop→Destroy→Create→Start→RestoreInstanceState→Resume

这里会涉及一个configuration的概念。在manifest文件里可以配置Activity的属性:
android:configChanges="orientation|screenSize"
此时切换横竖屏,Activity不会销毁,只会调用onConfigurationChanged方法。

3.任务和返回栈

应用通常包含多个Activity,当一个Activity被启动时,如果当前不存在任务,系统会创建新的任务,并将该Activity作为根Activity存在返回栈中,新的Activity启动时,会放在该Activity之上,处于栈顶位置,栈顶的Activity作为用户焦点。当back键按下时,栈顶的Activity被销毁出栈,下一个Activity推到栈顶位置。
应当注意的是,每个Activity会有一个taskAffinity属性,默认情况下,一个应用中所有的Activity都具有相同的taskAffinity,也就是说,所有Activity会被存放在同一个任务中,哪怕当前应用调用了其他应用的Activity。
如果想将Activity存放到新的任务中,采用以下步骤:
1.给intent添加一个NEW_TASK的flag
2.manifest中指定Activity的taskAffinity(通常值为某应用的包名)

除此之外,Activity还有一个allowTaskReparenting的属性。从字面可以这么理解,允许重新分配父任务。当设置它为true的时候,会出现这种情况:
A应用启动了B应用的一个Activity1,此时Activity1会处于A应用的任务栈中,这时候启动B应用,奇怪的事情发生了,B应用出现的不是启动界面,而是Activity1。因为,B应用创建了自己的任务栈之后,会将Activity1从A的栈中转移过来,所以显示的是Activity1。

4.启动模式

四种启动模式相信大家都耳熟能详了:
standard(默认模式)
Activity启动一次,就会生成一个新的实例,并添加到返回栈的顶部。
singleTop
如果当前栈顶位置已经有该Activity的实例,那么,系统只会调用onNewIntent方法,向其传送intent,不会生成新的实例。
如果当前栈顶位置不是该Activity,那么,不管该栈中是够有该Activity的其他实例,都会在栈顶生成新的Activity。
singleTask
任务栈中只允许有一个该Activity的实例。如果没有,生成一个,如果已有该Activity的实例,将该实例之上的Activity出栈,系统只会调用onNewIntent方法,向其传送intent,不会生成新的实例。
singleInstance
生成该Activity的实例,并将其放入单独的返回栈中,该栈中不允许存放其他的Activity。
如果之前已经生成该Activity的实例。那么,系统只会调用onNewIntent方法,向其传送intent,不会生成新的实例。
注意:除了standard模式,其他三个都存在调用onNewIntent的情况。

5.启动Activity以及参数传递

startActivity,通过intent传递参数就不多说了。详细说一下startActivityForResult:
此方法用在希望从启动的Activity获取返回结果的情况下。
相关方法:
startActivityForResult(Intent intent, Int requestCode)
setResut(int resultCode, Intent intent)
onActivityResult(int requestCode, int resultCode, Intent intent)

Activity A启动Activity B,并希望传回结果时,操作方法如下:

A用startActivityForResult来启动B,requestCode用来判断传回的结果(取值>=0)。因为一个Activity中可能有许多onActivityResult,所以必须设置requestCode用来识别传回的结果是来自哪一个Activity

B中用setResult来填入希望返回的值,resultCode设置为RESULT_OK,Intent用来携带传回的值

A中重写回调方法onActivityResult 根据requestCode来获取想要的结果。

值得一提的是,setResult应该在什么时候调用呢?
因为Activity被finish的时候才会把结果传回去,所以,setResult应该在被Activity被finish之前调用。

其他

Activity的属性及其意义,点击这里.
常用方法:
onBackPressed:按下back键时调用的方法
finish():销毁Activity

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

推荐阅读更多精彩内容

  • Activity 是一个应用组件,用户可与其提供的屏幕进行交互,以执行拨打电话、拍摄照片、发送电子邮件或查看地图等...
    岳小川阅读 480评论 0 3
  • 关于为什么要写属于自己的博客,我在前一篇文章中也提到了。主要是归纳自己这一个时期所学到的知识,帮助自己更好的理解,...
    Kevin_Jern阅读 876评论 0 9
  • 本文主要搜集记录一下Android开发的四大组件:一、Activity详解二、Service详解三、Broadca...
    AFinalStone阅读 590评论 0 2
  • [文章内容来自Developers]应用通常包含多个 Activity。每个 Activity 均应围绕用户可以执...
    岳小川阅读 690评论 0 4
  • 小的时候一块钱便是一笔巨款,我是个敛财奴,喜欢把七零八落的硬币聚起来,藏在我的百宝盆里。 班上的女老师每天贩卖...
    盲盲之书阅读 382评论 0 1