[笔记] Activity tips

生命周期

正常情况下的生命周期:

onCreate - onStart - onResume - onPause - onStop - onDestroy
| --------- onRestart --------|

Tips:
onStart 和 onStop 配对,一般标示着Activity是否 可见
onResume 和 onPause 配对,一般标示着Activity是否处于 前台
onPause中的操作尽量轻量,因为只有上一个Activity onPause之后, 新的Activity才能启动。

第一次启动:

onCreate - onStart - onResume

打开新的Activity或切换到桌面:

onPause - onStop
如果新的Activity采用了透明主题,那么当前的Activity不会回调onStop

再次返回到Activity

onRestart - onStart - onResume

back键退出时

onPause - onStop - onDestory

异常情况下的生命周期:

资源相关的配置发生变化导致Activty被杀死重建

系统配置变化导致Activity被杀死时,onPause、onStop和ondestory都会被调用,同时会调用onSaveInstanceState来保存当前状态,调用的时机是在onStop之前,与onPause没有明确的先后关系。当Activity重建时,会在onStart之后调用onRestoreInstanceState,并且把之前onSaveInstanceState时保存的状态以Bundle参数传递给onCreate和onRestoreInstanceState, 我们可以在其中恢复之前保存的状态。
系统会在onSaveInstanceState 和 onRestoreInstanceState 帮我们做很多工作,如文本框的输入内容,listView位置等。

如果系统配置发生变化时,而我们不想重新创建Activity,可以在AndroidManifest中给Activity指定configChanges属性.

常用的configChanges属性:
locale、keyboardHidden、orientation、screenSize等
在SDK大于13时,screenSize会导致屏幕旋转式重建Activity,所以在避免屏幕旋转重构时,需要加上此属性。

内存不足导致Activity被杀死

当内存不足时,系统会从 后台Activity、可见但非前台Activity、前台Activity的优先级顺序去杀死Activity,并通过onSaveInstanceState 和 onRestoreInstanceState保存和恢复。

启动模式

  1. standard:标准模式,每次都会新建一个Activity实例,并进入启动它的那个Activity的任务栈

Tips:
如果是由非Activity类型的context启动一个standard模式的Activity,如 ApplicationContext,由于此时的context是没有任务栈的,所以会报错,解决方法是:给待启动的Activity指定 FLAG_ACTIVITY_NEW_TASK 标记。这样启动时,就会给它新建一个新的任务栈,其实此时实际是以 singleTask模式去启动的。

  1. singleTop: 栈顶复用模式,如果新的Activity已经位于任务栈的栈顶,则不会重新创建,同时 onNewIntent会被调用(不会调用onCreate、onStart)。

  2. singleTask:栈内复用模式,只要Activty在任务栈内存在,则不会重新创建,同时 onNewIntent会被调用(不会调用onCreate、onStart)。此模式默认带有clearTop功能,会把要复用的Activity上面的其他Activity从栈顶出栈。

  3. singleInstance:单实例模式,加强版singleTask,在singleTask特性上,Activity只能单独的在一个任务栈中。当 singleInstance Activity创建时,系统会给它一个单独的任务栈。

什么是任务栈?
任务栈是一个具有栈结构的容器,可以放置多个Activity实例。启动一个应用,系统就会为之创建一个任务栈,来放置根Activity;默认情况下,一个Activity启动另一个Activity时,两个Activity是放置在同一个任务栈中的,后者被压入前者所在的任务栈,当用户按下后退键,后者从任务栈被弹出,前者又显示在幕前,特别是启动其他应用中的Activity时,两个Activity对用户来说就好像是属于同一个应用;任务栈任务栈之间是互相独立的,当我们运行一个应用时,按下Home键回到主屏,启动另一个应用,这个过程中,之前的任务栈被转移到后台,新的任务栈被转移到前台,其根Activity也会显示到幕前,过了一会之后,在此按下Home键回到主屏,再选择之前的应用,之前的任务栈会被转移到前台,系统仍然保留着任务栈内的所有Activity实例,而那个新的任务栈会被转移到后台,如果这时用户再做后退等动作,就是针对该任务栈内部进行操作了。

默认情况下,应用内所有的Activity都是运行在一个与应用包名相同的任务栈下,那要怎么改变Activity的任务栈呢?可以使用TaskAffinity,它可以指定Activity所在的栈。

IntentFilter 匹配规则

Activity启动分为显式和隐式,显式指明确指定要启动的Activity,隐式则通过Intent来匹配目标Activity的IntentFilter,匹配成功才能启动。

IntentFilter中的匹配信息有 action、category、data,一个IntentFilter中的action、category、data可以有多个,只有同时陪陪action、category、data时才算成功。

  1. action 匹配
    Intent必须有一个action存在 且必须和IntentFilter中的其中一个action相同。

  2. category 匹配
    如果有category存在,不管有多少个,都必须要和IntentFilter中的category相同。
    在隐式启动时,系统会默认给一个android.intent.category.DEFAULT的category,所以可以被隐式启动的Activity需要在IntentFilter中加上 android.intent.category.DEFAULT, 否则会匹配不上。

3.data 匹配
data由mimeType和URI组成, mimeType指定媒体类型,如 image/jpeg
URI包含 scheme、host、port、path;URI中只有指定了scheme和host才有效,注意:默认的scheme是 file和content。

Tips: IntentFilter 匹配规则对Service和BroadcastReceiver也是一样的
android.intent.action.MAIN
android.intent.category.LAUNCHER

这两个一起使用表明时应用的入口Activity

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

推荐阅读更多精彩内容

  • Activity 一、四种形态 运行状态: 当 Activity 处于栈的顶层,可见,并可与用户进行交互 onRe...
    任教主来也阅读 1,613评论 1 10
  • 本篇博客是笔者看过《Android开发艺术探索》才写的,有些是借鉴了此本书的内容,当有些内容进行了精进。 Acti...
    ClAndEllen阅读 3,412评论 1 27
  • 一本android开发程序员必读的一本书,感谢任玉刚大佬的分享 一、Activity的生命周期全面分析 典型情况下...
    kongjn阅读 530评论 1 3
  • 这是我第三遍看《Android开发艺术探索》这本书了,从第一遍看的云里雾里,第二遍略微明白之后,我决定看第三遍,并...
    陈添阅读 839评论 2 8
  • 最小的App 纯粹使用代码(而不需要Storyboard)来创建一个iOS App是可行的。 首先做些操作性的工作...
    1000copy阅读 808评论 0 1