Activity-启动模式解析

Android 中有存在着 4 种启动模式,standardsingleTopsingleTasksingleInstance,本篇文章将来解释下这四种模式在的一些基础知识,以及日常开发中的应用,下面通过几个问题来开始本篇文章:

  1. 什么是 Task
  2. TaskActivity 的关系是什么?
  3. 4 种启动模式特点分别是什么?
  4. 4 种启动模式的应用场景有什么?

在讲解 4 种启动模式之前需要先学习一下 Task 方面的知识:

Task 解析

Task 可以理解为处理一系列事务的 Activity 合集,那这样就存在两种情况:
1) 该 Task 所有的 Activity属于同一个APP;
2) 该 TaskActivity属于不同的APP;
无论是哪种情况,都属于同一个 Task ,记住是同一个 Task !!!

Task
作为用户的话,我们可以点击手机的 Navigation 按钮来查看当前运行的 Task
直观地查看Task

Task的启动方式
  1. 新建:含有 3 种启动方式
    1)通过通知启动 APP
    2)通过 Launcher(图标,自己)启动
    3)通过 scheme,第三方应用去启动 APP
    2.恢复:含有两种启动方式
    1)在 Task 一定存在的情况下,通过 Navigation 启动,参考上图,查看Task图片
    2)通过标题栏 back 按键
    back按键
    相信我们对 Activity 的生命周期的生命周期肯定都很熟悉了,下面主要来介绍一下 Activity 中一些比较容易忽略的知识点:
    1)生命周期的对应
    图片.png

    2)onCreateonStart 之间的区别
  • 可见与不可见的区别。onCreate 不可见,onStart 可见。
  • 执行次数的区别。onCreate 方法只在 Activity 创建时执行一次,而 onStart 方法在 Activity 的切换以及按Home键返回桌面再切回应用的过程中被多次调用。因此 Bundle 数据的恢复在 onStart 中进行比 onCreate 中执行更合适。
  • onCreate 能做的事 onStart 其实都能做,但是 onstart 能做的事 onCreate 却未必适合做。setContentView 和资源初始化在两者都能做,然而想动画的初始化在 onStart 中做比较好。
    3)onStart 方法和 onResume 方法的区别
  • 是否在前台。onStart 方法中Activity可见但不在前台,不可交互,而在 onResume 中在前台
  • 职责不同,onStart 方法中主要还是进行初始化工作,而 onResume方法,根据官方的建议,可以做开启动画和独占设备的操作。
    4)onPause 方法和 onStop 方法的区别
  • 是否可见。onPauseActivity 可见,onStopActivity不可见,但Activity对象还在内存中。
  • 在系统内存不足的时候可能不会执行onStop方法,因此程序状态的保存、独占设备和动画的关闭、以及一些数据的保存最好在onPause中进行,但要注意不能太耗时。
    5)onStop 方法和 onDestroy 方法的区别?
  • onStop 阶段 Activity 还没有被销毁,对象还在内存中,此时可以通过切换Activity 再次回到该Activity ,而 onDestroy 阶段 Acivity 被销毁。

在学习的过程中我们经常会遇到听到一个方法:onNewIntent,由于 standard 基本每次都会新建一个实例,因此没有这个方法,这个方法只存在于其他 3 种启动方式中。

下面就开始进入今天的主题 4 种启动方式的介绍:

standard

  • standard 的启动模式中,如果在 Task 中存在有实例的话,下次从Launcher(图标)进入的话不会再去新建一个实例,而是走OnRestart()过程。这是因为 Intent 中有一个 public static final int FLAG_ACTIVITY_NEW_TASK = 0x10000000;

    FLAG_ACTIVITY_NEW_TASK
    通过上面这个谷歌的注释可以看出,当启动时带有这个FLAG时,而且Task中存在该实例的话,不会再去新建新建实例:
    FLAG_ACTIVITY_NEW_TASK
    而且此时走的也是OnRestart()流程:
    图片.png

  • 当启动一个带有 AffinityActivity 时,如果不带上newTask的话,新建的Activity则会在原来的Task上(所谓的 Affinity 可以理解一个 Task 的名称,当一个 Activity 不指定 Affinity 时,默认就是它的 PackageName

    指定Affinity时,不带newTask,创建在原来的Task上,不会新建Task
    指定Affinity时,带上newTask,则新建一个Task,在该Task上新建实例

  • 如果指定的 Affinity 是默认的APP Affinity (PackageName)的话,每次都会新建一个实例

    该效果类似于上面的不指定new_Task

singleTop

指的是一个 Task 的栈顶只能存在一个实例,这里有一点值得注意的是,由于可以存在多个 Task ,因此就存在多个 Task 的栈顶存在相同一个实例的情况。
而当栈顶存在该实例的时候,下次进入的时候不会再去新建实例,而是会调用onNewIntent方法发送到现有的Activity

singleTop执行流程图
从上面可以看出NEW_TASK这个标志位,只影响standardsingleTop这两种启动模式

singleTask

singleTask 指的是一个Task中只允许存在一个实例,如果该Task中存在该实例的话,下次进入的话也是会通过onNewIntent方法发送到现有的Activity。同样地,由于可以存在多个 Task ,因此就存在多个 Task 中存在相同一个实例的情况。还有一点与singleTop不同的是,当找到Task中存在该实例时,会将它上面的实例清空掉(CLEAR_TOP)然后将实例提到栈顶。而singleTop则是在栈顶找不到实例时,在栈顶新建一个实例,不管它下面有没有。

singleTask流程图

singleInstance

通过这种方式启动的Activity 都处于一个单独的 Task 中,且该 Task 中也只有一个该实例,下次启动时,如果已经存在该 Task 不会再去新建实例,而是会调用onNewIntent方法发送到现有的Activity类似于singleTask

最后是这 3 种启动模式的应用场景:

应用场景

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