Android基础-Activity讲解

Activity是四大组件之一,Activity本身是没有界面的,Activity类创建一个窗口,通过setContentView(View)接口把.xml界面放到Activity创建的窗口上。 几乎所有的Activity都要和用户打交道,说简单点就是,我们在手机上看到的界面基本上都是需要一个Activity承载的。

Activity生命周期

从创建开始到被销毁,会依次调用onCreate->onStart->onResume->onPause->onStop->onDestory
onCreate:创建界面,做一些数据的初始化工作
onStart:用户可见但不可交互的状态
onResume:变成和用户交互的状态
onPause:Activity 可见不可交互,系统会停止动画等消耗CPU的事情
onStop:变得不可见,被下一个Activity覆盖了
onDestory:被kill前最后一个被调用的方法,可能是其他类调用finish方法或者是系统为了节省空间将他暂时性的干掉,可以用isFinishing()来判断。

在一个Activity正常启动的过程中,方法的调用顺序是onCreate->onStart->onResume,被kill掉的顺序是onPause->onStop->onDestory。如果电话突然来了,这是会调用onPause->onStop,接完电话重新回到界面,onStart->onResume,被对话框打断,但此时是透明的onPause。

  1. 启动Activity
    执行onCreate()->onStart()->onResumed()
    这个过程执行完,我们的activity就显示在屏幕上。
  2. 销毁Activity
    当执行finish()或者被系统强制杀死时,我们的activity会被销毁,此时activity内部会执行onPause()->onStop()->onDestory()
  3. 暂停和继续
    当界面被部分遮挡住,会进入暂停状态,此时会执行onPause(),
    当界面重新完全显示后又会回到继续状态(Resumed),会执行onResumed()
    在即将Pause时,我们应该在onPause中执行一些释放操作,比如停止正在进行的动画,一些用户的状态(确定用户会保存的,比如邮件草稿),释放系统资源(如广播接收者,传感器),以及其他会消耗电池并且在pause时用户不需要用到的。这些释放或者保存的,我们在onResume的时候需要恢复。
  4. 停止和重启
    用户进去其他界面之后,如接听电话,或者打开其他activity,我们的界面会停止,进入stoped状态。此时会执行onPause()->onStop()
    重启时会执行onRestart()->onStart()->onResume()
    重启时候和我们创建时相比,多了一步onRestart()
    在stop的时候,我们需要执行一些比在onPause中更加消耗CPU的更大任务,比如写数据库。
    同时建议,在onStart()中恢复,而不是在onRestart()中恢复。
  5. 重新创建Activity
    当我们的进行被destory(非用户主动调用finish),可以返回。返回的时候会重新创建。执行过程和创建activity一样。
    当activity被系统kill之前,会调用onSaveInstanceState()去保存UI状态,如果我们有信息需要保存也可以去重写这个方法去做。
    同时我们可以重写onRestoreInstanceState()去恢复状态。不重写,系统会恢复系统保存的那一部分ui,或者我们可以在onCreate中恢复,onCreate的参数saveInstanceState就是我们保存的信息,可以判断改参数是否为空,来恢复界面。

Activity的启动模式

  1. standard:默认模式,就是新进入的压在已存在的界面之上
  2. singleTop:栈顶复用模式
  3. singleTask:栈内复用模式
  4. singleInstance:栈内单例模式

singleTop

如果新的Activity已经位于任务栈的栈顶,那么此时Activity不会被重新创建,同事onNewIntent()会被回调
如果使用这种模式,那么在任务栈中栈顶到栈底为CBA的情况下,再次打开C,那么界面C的onCreate()和onStart()不会被调用,会调用的是onPause()->onNewIntent()->onResume()。

singleTask

如果是栈内复用,当打开C的时候,会查询所有的任务栈,如果有任务栈包含C,那么把这个任务栈移动到所有栈的首位,并清除掉这个栈内C到栈顶的其他Activity,最后调用C的onNewIntent()方法。如果没有就直接在所需的任务栈的栈顶创建C的实例。

singleInstance

就是singleTask的加强版,当新建Activity时,会重新创建一个新的任务栈,然后创建实例放入这个新的栈内,下一个实例不会和这个Activity所属的栈共存,汇创建一个新的栈继续存.

部分参考:https://isming.me/2014/03/25/manage-activityde-lifecycle/

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

推荐阅读更多精彩内容