Android Activity 的启动模式

Activity 的 LaunchMode

Android 目前有四中启动模式:standard、singleTop、singleTask、singleInstance。

  1. standard:标准模式,也是系统默认模式。每次启动一个 Activity 都会重新创建一个新的实例,被创建的实例的生命周期符合典型的情况下的 Activity 的生命周期。这种模式下,谁启动了这个 Activity,那么这个 Activity,那么这个 Activity 就运行在启动它的那个 Activity 所在的任务栈中。如果用 ApplicationContext 去启动 standard 模式的 Activity 会报错,因为非 Activity 类型的 context 并没有任务栈。 这种情况在安卓高版本,如 7.0,8.0 是不会出错的,在安卓 4.4 是会报错的,怀疑安卓修改了非 Activity 启动 Activity 的机制。
  2. singleTop:栈顶复用模式。如果新的 Activity 已经位于任务栈的栈顶,那么此 Activity 不会被重新创建,同时它的 onNewIntent 方法会被调用,通过此方法的参数我们可以取出当前请求的信息。这个 Activity 的 onCreate、onStart 不会被系统调用,因为它没有发生改变,如果新Activity的实例已存在,但不是位于栈顶,那么新 Activity 仍然会重新创建。
    启动栈顶 Activity 的生命周期如下。
onPause
onNewIntent
onResume
  1. singleTask:栈内复用模式。只要 Activity 在一个栈中存在,那么多次启动此 Activity 都不会重新创建实例,系统也会回调其 onNewIntent。当一个具有 singleTask 模式的 Activity 请求启动后,系统首先会寻找是否存在 A 想要的任务栈,如果不存在就创建一个任务栈,并将新创建的实例放入栈中。如果存在其所需要的任务栈,这个栈中要是有该实例存在,就会把其调到栈顶并调用它的 onNewIntent 方法,如果不存在,就创建该实例并将其压入栈中。
  2. singleInstance:单实例模式,加强版的 singleTask,拥有 singleTask 模式的所有特征,除此之外,具有这种模式的 Activity 只能独立的位于一个任务栈中,后续的请求都会创建新的 Activity,除非这个独特的任务栈被系统销毁。

TaskAffinity 这个参数标识了一个 Activity 所需要的任务栈的名字,默认情况下,所有 Activity 所需要的任务栈的名字为应用的包名。

  <activity android:name=".SecondActivity"
      android:taskAffinity="com.example.testandroid.task1"
      android:launchMode="singleTask"/>

指定启动模式

方法一:通过 AndroidMenifest 为 Activity 指定启动模式。

  <activity .
    android:name=".LifecycleActivity"
    android:launchMode="singleTask"/>

方法二:通过在 Intent 中设置标志位来位 Activity 指定启动模式。

  Intent intent = new Intent(MyApplication.this, LifecycleActivity.class);
  intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  startActivity(intent);

这两种方法都能为 Activity 指定启动模式,优先级上第二种方法要高于第一种,如果两个同时存在,以第二种方式为准;其次,第一种方法无法直接为 Activity 设定 FLAG_ACTIVITY_CLEAR_TOP 标识,而第二种方式无法为 Activity 指定 singleInstance 模式。

Activity 的 Flags

设定 Activity 的启动模式

字段 作用
FLAG_ACTIVITY_NEW_TASK 为 Activity 指定 singleTask
FLAG_ACTIVITY_SINGLE_TOP 为 Activity 指定 singleTop

影响 Activity 的运行状态

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

推荐阅读更多精彩内容