第1章 Activity的生命周期和启动模式

1.1 Activity生命周期全面分析

1.1.1 典型情况下生命周期分析

  1. Activity从不可见重新变为可见状态时,调用onRestart。
    1. 当用户打开新的Activity或者切换到桌面的时候,回调如下:onPause -> onStop,
    2. 如果新Activity采用了透明主题,那么onStop方法不会被回调。
    3. 当用户再次回到原来的Activity时,回调如下:onRestart -> onStart -> onResume。
  2. 是否可见,onStart和onStop对应;是否前台,onPause和onResume方法对应。
  3. 从Activity A进入到Activity B,调用顺序是onPause(A) -> onCreate(B) -> onStart(B) -> onResume(B) -> onStop(A),所以不能在onPause方法中做重量级的操作。

1.1.2 异常情况下生命周期分析

1.1.2.1 activity被杀死并重建
  1. Activity被异常终止,在activity即将被系统销毁并且有机会重新显示时,系统会调用onSaveInstanceState。(如acitivty正常关闭不会调用onSaveInstanceState,而旋转屏幕就会调用onSaveInstanceState)
  2. onSaveInstanceState调用时机在onStop之前,和和onPause方法没有既定的时序关系。
  3. 当Activity被重新创建的时候,onRestoreInstanceState会被回调,它的调用时机是onStart之后。
  4. onSaveInstanceState主要用途是保存数据,系统会默认保存当前视图结构。
  5. onRestoreInstanceState主要用途是恢复数据,系统默认恢复的数据有文本框中用户输入的数据、listview滚动的位置等。
  6. 具体针对某一个view系统能为我们恢复哪些数据可以查看view的源码中的onSaveInstanceState和onRestoreInstanceState方法。
  7. 系统调用onSaveInstanceState/onRestoreInstanceState,会委托Window上面的容器去保存/恢复数据,最终会调用view的onSaveInstanceState/onRestoreInstanceState方法。这是典型的委托思想。
1.1.2.2资源内存不足导致低优先级activity被杀死

Activity按优先级的分类

  • 前台Activity;
  • 可见但非前台Activity;
  • 后台Activity

当系统不足时,系统会按照上面优先级杀死activity所在进程,并通过onSaveInstanceState/onRestoreInstanceState存储和恢复数据。

1.1.2.3 android:configChanges="xxx"属性,常用的主要有下面三个选项:

local:设备的本地位置发生了变化,一般指切换了系统语言;
keyboardHidden:键盘的可访问性发生了变化,比如用户调出了键盘;
orientation:屏幕方向发生了变化,比如旋转了手机屏幕。
配置了android:configChanges="xxx"属性之后,Activity就不会在对应变化发生时重新创建,而是调用Activity的onConfigurationChanged方法。

1.2 Activity启动模式

  1. task的概念:是一个Activity的栈,每一个Activity都有一个“所需要的任务栈”——TaskAffinity,默认情况下TaskAffinity就是包名。
  2. 四大模式
    1. standard
    2. singleTop
    3. singleTask
    4. singleInstance
      3 Activity的Flags
    5. FLAG_ACTIVITY_NEW_TASK
    6. FLAG_ACTIVITY_SINGLE_TOP
    7. FLAG_ACTIVITY_CLEAR_TOP
    8. FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:它等同于属性设置android:excludeFromRecents="true"。不加入历史列表
  3. 注意事项:
    1. standard模式下,如果是非Activity类型的Context来startActivity,必须加上FLAG_ACTIVITY_NEW_TASK。因为此Context无task,所以必须要新建一个。
    2. singleTask下startActivity有三种情况(D的launchmode是singletask)
      1. S1栈中有ABC, D的TaskAffinity为S2,则新建S2栈,D入栈S2
      2. S1栈中有ABC,D的TaskAffinity为S1,则D入栈S1
      3. D的TaskAffinity为S1,S1栈中有ADBC,则clearTop,最终S1栈中为AD,系统会调用D的onNewIntent(流程为onPause-onNewIntent-onResume)
    3. 任务栈分为前台任务栈和后台任务栈,用户可以通过切换将后台任务栈再次调到前台。
    4. 设置启动模式既可以使用xml属性android:launchMode,也可以使用代码intent.addFlags()。区别在于限定范围不同,前者无法直接为Activity设置FLAG_ACTIVITY_CLEAR_TOP标识,而后者无法为Activity指定singleInstance模式。
  4. 查看activity命令: adb shell dumpsys activity

1.3 IntentFilter匹配规则

  1. action匹配规则
    只要Intent中的action能够和过滤规则中的任何一个action相同即可匹配成功,action匹配区分大小写。
  2. category匹配规则
    Intent中如果有category那么所有的category都必须和过滤规则中的其中一个category相同,如果没有category的话那么就是默认的category,即android.intent.category.DEFAULT,所以为了Activity能够接收隐式调用,配置多个category的时候必须加上默认的category。
  3. 如何判断是否有Activity能够匹配我们的隐式Intent?
    1. PackageManager的resolveActivity方法或者Intent的resolveActivity方法:如果找不到就会返回null
    2. PackageManager的queryIntentActivities方法:它返回所有成功匹配的Activity信息 针对Service和BroadcastReceiver等组件,PackageManager同样提供了类似的方法去获取成功匹配的组件信息,例如queryIntentServices、queryBroadcastReceivers等方法
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容