android生命周期,启动模式,flags

android生命周期,启动模式,flags

Activity 生命周期

image.png
image.png

从ActivityA 启动到ActivityB生命周期流程如下

2019-06-25 15:45:06.219 23662-23662/com.zitu.system I/AAt: -----onCreate
2019-06-25 15:45:06.228 23662-23662/com.zitu.system I/AAt: -----onStart
2019-06-25 15:45:06.230 23662-23662/com.zitu.system I/AAt: -----onResume
2019-06-25 15:45:08.824 23662-23662/com.zitu.system I/AAt: -----onPause
2019-06-25 15:45:08.848 23662-23662/com.zitu.system I/BAt: ----onCreate
2019-06-25 15:45:08.850 23662-23662/com.zitu.system I/BAt: ----onStart
2019-06-25 15:45:08.853 23662-23662/com.zitu.system I/BAt: ----onResume
2019-06-25 15:45:09.303 23662-23662/com.zitu.system I/AAt: -----onStop

注意当B Activity 开始调用onResume的时候A Activity开始调用onstop

从ActivityB 返回到ActivityA生命周期流程如下

2019-06-25 15:47:11.858 23662-23662/com.zitu.system I/BAt: ----onPause
2019-06-25 15:47:11.865 23662-23662/com.zitu.system I/AAt: -----onRestart
2019-06-25 15:47:11.865 23662-23662/com.zitu.system I/AAt: -----onStart
2019-06-25 15:47:11.865 23662-23662/com.zitu.system I/AAt: -----onResume
2019-06-25 15:47:12.225 23662-23662/com.zitu.system I/BAt: -----onStop
2019-06-25 15:47:12.225 23662-23662/com.zitu.system I/BAt: -----onDestroy

注意当A Activity 开始调用onResume的时候B Activity开始调用onstop和onDestory<br />注意这个时候不会走onNewIntent();
<a name="RNdgk"></a>

启动模式结合生命周期

四种启动模式

  • standard 标准模式,每次都新建一个实例对象
  • singleTop 如果在任务栈顶发现了相同的实例则重用,否则新建并压入栈顶
  • singleTask 如果在任务栈中发现了相同的实例,将其上面的任务终止并移除,重用该实例。否则新建实例并入栈
  • singleInstance 允许不同应用,进程线程等共用一个实例,无论从何应用调用该实例都重用

standard

每次都会新建,这里不具体描述,默认为该模式

singleTop

等同于flag=FLAG_ACTIVITY_SINGLE_TOP<br />启动activity A 在A中启动 Activity B 在B中启动A 此时A

  <activity android:name=".BAt"  android:launchMode="singleTop"/>
2019-06-25 17:42:45.427 10234-10234/com.zitu.system I/AAt: -----onCreate
2019-06-25 17:42:45.466 10234-10234/com.zitu.system I/AAt: -----onStart
2019-06-25 17:42:45.471 10234-10234/com.zitu.system I/AAt: -----onResume
2019-06-25 17:42:49.328 10234-10234/com.zitu.system I/AAt: -----onPause
2019-06-25 17:42:49.370 10234-10234/com.zitu.system I/BAt: ----onCreate
2019-06-25 17:42:49.371 10234-10234/com.zitu.system I/BAt: ----onStart
2019-06-25 17:42:49.376 10234-10234/com.zitu.system I/BAt: ----onResume
2019-06-25 17:42:49.595 10234-10234/com.zitu.system I/AAt: -----onStop
2019-06-25 17:42:50.479 10234-10234/com.zitu.system I/BAt: ----onPause
2019-06-25 17:42:50.479 10234-10234/com.zitu.system I/BAt: ----NewIntent
2019-06-25 17:42:50.480 10234-10234/com.zitu.system I/BAt: ----onResume

此时B未重建,直接复用了之前的B

singleTask

启动activity A 在A中启动 Activity B 在B中启动A 其中 Activity A 在mainfest的设置如下

   <activity android:name=".AAt" android:launchMode="singleTask">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
   </activity>

效果如下:

2019-06-25 16:23:11.014 6996-6996/com.zitu.system I/AAt: -----onCreate
2019-06-25 16:23:11.061 6996-6996/com.zitu.system I/AAt: -----onStart
2019-06-25 16:23:11.067 6996-6996/com.zitu.system I/AAt: -----onResume
2019-06-25 16:23:18.565 6996-6996/com.zitu.system I/AAt: -----onPause
2019-06-25 16:23:18.606 6996-6996/com.zitu.system I/BAt: ----onCreate
2019-06-25 16:23:18.608 6996-6996/com.zitu.system I/BAt: ----onStart
2019-06-25 16:23:18.612 6996-6996/com.zitu.system I/BAt: ----onResume
2019-06-25 16:23:18.821 6996-6996/com.zitu.system I/AAt: -----onStop
2019-06-25 16:23:39.001 6996-6996/com.zitu.system I/BAt: ----onPause
2019-06-25 16:23:39.012 6996-6996/com.zitu.system I/AAt: -----onNewIntent
2019-06-25 16:23:39.017 6996-6996/com.zitu.system I/AAt: -----onRestart
2019-06-25 16:23:39.018 6996-6996/com.zitu.system I/AAt: -----onStart
2019-06-25 16:23:39.018 6996-6996/com.zitu.system I/AAt: -----onResume

不会重建直接复用了

singleInstance

三个实验
第一个:启动ActivityA 在A中启动ActivityB 在B中启动ActivityC B的启动方式为singleInstance此时按返回键 返回的顺序是C ->A->B 通过log我们发现A和C是同一个任务栈,B我单独一个任务栈

2019-06-26 10:11:02.459 14609-14609/com.zitu.system I/AAt: -----onCreate
2019-06-26 10:11:02.459 14609-14609/com.zitu.system I/AAt: ----onCreate144
2019-06-26 10:11:02.489 14609-14609/com.zitu.system I/AAt: -----onStart
2019-06-26 10:11:02.495 14609-14609/com.zitu.system I/AAt: -----onResume
2019-06-26 10:11:04.978 14609-14609/com.zitu.system I/AAt: -----onPause
2019-06-26 10:11:05.052 14609-14609/com.zitu.system I/BAt: ----onCreate
2019-06-26 10:11:05.052 14609-14609/com.zitu.system I/BAt: ----onCreate145
2019-06-26 10:11:05.054 14609-14609/com.zitu.system I/BAt: ----onStart
2019-06-26 10:11:05.058 14609-14609/com.zitu.system I/BAt: ----onResume
2019-06-26 10:11:05.390 14609-14609/com.zitu.system I/AAt: -----onStop
2019-06-26 10:11:07.123 14609-14609/com.zitu.system I/BAt: ----onPause
2019-06-26 10:11:07.187 14609-14609/com.zitu.system I/CAt: ----onCreate144
2019-06-26 10:11:07.606 14609-14609/com.zitu.system I/BAt: -----onStop

A和C都为144 c为145
第二个实验:启动ActivityA 在A中启动ActivityB B的启动方式为singleInstance<br />此时按Home 再次点击进入的时候此时显示的是A界面 因为应该的主任务栈为A所在的任务栈,所有会优先选择A
第三个实验:启动ActivityA 在A中启动ActivityB 在B中再次启动B B的启动方式为singleInstance

2019-06-26 10:16:44.329 15135-15135/com.zitu.system I/AAt: -----onCreate
2019-06-26 10:16:44.330 15135-15135/com.zitu.system I/AAt: ----onCreate153
2019-06-26 10:16:44.369 15135-15135/com.zitu.system I/AAt: -----onStart
2019-06-26 10:16:44.375 15135-15135/com.zitu.system I/AAt: -----onResume
2019-06-26 10:16:45.899 15135-15135/com.zitu.system I/AAt: -----onPause
2019-06-26 10:16:45.984 15135-15135/com.zitu.system I/BAt: ----onCreate
2019-06-26 10:16:45.985 15135-15135/com.zitu.system I/BAt: ----onCreate154
2019-06-26 10:16:45.986 15135-15135/com.zitu.system I/BAt: ----onStart
2019-06-26 10:16:45.991 15135-15135/com.zitu.system I/BAt: ----onResume
2019-06-26 10:16:46.311 15135-15135/com.zitu.system I/AAt: -----onStop
2019-06-26 10:16:47.286 15135-15135/com.zitu.system I/BAt: ----onPause
2019-06-26 10:16:47.286 15135-15135/com.zitu.system I/BAt: ----NewIntent
2019-06-26 10:16:47.286 15135-15135/com.zitu.system I/BAt: ----onResume

我们发现此时B未重建直接复用了之前的,是不是单列模式很像。
<a name="GROF6"></a>

启动flags概述

  • FLAG_ACTIVITY_SINGLE_TOP 和launchMode='singleTop'使用效果相同
  • FLAG_ACTIVITY_NEW_TASK 不等同于launchMode='singleTask'
  • FLAG_ACTIVITY_CLEAR_TOP FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_NEW_TASK两者同时使用,等同于FLAG_ACTIVITY_CLEAR_TOP
  • FLAG_ACTIVITY_CLEAR_TASK 会清空掉所有的activity必须和 FLAG_ACTIVITY_NEW_TASK一起使用
    <a name="p6wUC"></a>

FLAG_ACTIVITY_CLEAR_TOP

启动activity A 在A中启动 Activity B 在B中启动A 此时A的flag 为FLAG_ACTIVITY_CLEAR_TOP

2019-06-25 17:49:08.122 10554-10554/com.zitu.system I/AAt: -----onCreate
2019-06-25 17:49:08.154 10554-10554/com.zitu.system I/AAt: -----onStart
2019-06-25 17:49:08.159 10554-10554/com.zitu.system I/AAt: -----onResume
2019-06-25 17:49:10.602 10554-10554/com.zitu.system I/AAt: -----onPause
2019-06-25 17:49:10.639 10554-10554/com.zitu.system I/BAt: ----onCreate
2019-06-25 17:49:10.640 10554-10554/com.zitu.system I/BAt: ----onStart
2019-06-25 17:49:10.643 10554-10554/com.zitu.system I/BAt: ----onResume
2019-06-25 17:49:10.848 10554-10554/com.zitu.system I/AAt: -----onStop
2019-06-25 17:49:12.685 10554-10554/com.zitu.system I/BAt: ----onPause
2019-06-25 17:49:12.694 10554-10554/com.zitu.system I/AAt: -----onDestroy
2019-06-25 17:49:12.710 10554-10554/com.zitu.system I/AAt: -----onCreate
2019-06-25 17:49:12.729 10554-10554/com.zitu.system I/AAt: -----onStart
2019-06-25 17:49:12.732 10554-10554/com.zitu.system I/AAt: -----onResume
2019-06-25 17:49:12.944 10554-10554/com.zitu.system I/BAt: -----onStop
2019-06-25 17:49:12.944 10554-10554/com.zitu.system I/BAt: -----onDestroy
2019-06-25 17:49:08.122 10554-10554/com.zitu.system I/AAt: -----onCreate
2019-06-25 17:49:08.154 10554-10554/com.zitu.system I/AAt: -----onStart
2019-06-25 17:49:08.159 10554-10554/com.zitu.system I/AAt: -----onResume
2019-06-25 17:49:10.602 10554-10554/com.zitu.system I/AAt: -----onPause
2019-06-25 17:49:10.639 10554-10554/com.zitu.system I/BAt: ----onCreate
2019-06-25 17:49:10.640 10554-10554/com.zitu.system I/BAt: ----onStart
2019-06-25 17:49:10.643 10554-10554/com.zitu.system I/BAt: ----onResume
2019-06-25 17:49:10.848 10554-10554/com.zitu.system I/AAt: -----onStop
2019-06-25 17:49:12.685 10554-10554/com.zitu.system I/BAt: ----onPause
2019-06-25 17:49:12.694 10554-10554/com.zitu.system I/AAt: -----onDestroy
2019-06-25 17:49:12.710 10554-10554/com.zitu.system I/AAt: -----onCreate
2019-06-25 17:49:12.729 10554-10554/com.zitu.system I/AAt: -----onStart
2019-06-25 17:49:12.732 10554-10554/com.zitu.system I/AAt: -----onResume
2019-06-25 17:49:12.944 10554-10554/com.zitu.system I/BAt: -----onStop
2019-06-25 17:49:12.944 10554-10554/com.zitu.system I/BAt: -----onDestroy

可以看到A未重用,而是直接新建了。
<a name="SYlvq"></a>

FLAG_ACTIVITY_NEW_TASK不等于singleTask

在上下文中启动activity必须加该标记,同一个应用如果不设置taskid 的话,都是相同的。<br />否则需要设置taskAffinity属性
<a name="rdoe0"></a>

FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_NEW_TASK一起使用效果等同于单独使用FLAG_ACTIVITY_CLEAR_TOP

启动activity A 在A中启动 Activity B 在B中启动A 此时A的flag 为FLAG_ACTIVITY_CLEAR_TOP|<br />FLAG_ACTIVITY_NEW_TASK

2019-06-26 09:42:12.739 13283-13283/com.zitu.system I/AAt: -----onCreate
2019-06-26 09:42:12.774 13283-13283/com.zitu.system I/AAt: -----onStart
2019-06-26 09:42:12.778 13283-13283/com.zitu.system I/AAt: -----onResume
2019-06-26 09:42:17.747 13283-13283/com.zitu.system I/AAt: -----onPause
2019-06-26 09:42:17.786 13283-13283/com.zitu.system I/BAt: ----onCreate
2019-06-26 09:42:17.787 13283-13283/com.zitu.system I/BAt: ----onStart
2019-06-26 09:42:17.792 13283-13283/com.zitu.system I/BAt: ----onResume
2019-06-26 09:42:17.999 13283-13283/com.zitu.system I/AAt: -----onStop
2019-06-26 09:42:19.445 13283-13283/com.zitu.system I/BAt: ----onPause
2019-06-26 09:42:19.455 13283-13283/com.zitu.system I/AAt: -----onDestroy
2019-06-26 09:42:19.470 13283-13283/com.zitu.system I/AAt: -----onCreate
2019-06-26 09:42:19.490 13283-13283/com.zitu.system I/AAt: -----onStart
2019-06-26 09:42:19.495 13283-13283/com.zitu.system I/AAt: -----onResume
2019-06-26 09:42:19.700 13283-13283/com.zitu.system I/BAt: -----onStop
2019-06-26 09:42:19.700 13283-13283/com.zitu.system I/BAt: -----onDestroy

可以看到这个时候直接A的话直接也是重建了

FLAG_ACTIVITY_CLEAR_TASK

启动activity A 在A中启动 Activity B 在B中启动A 此时A的flag 为FLAG_ACTIVITY_CLEAR_TASK|FLAG_ACTIVITY_NEW_TASK

2019-06-26 09:49:06.628 13506-13506/com.zitu.system I/AAt: -----onCreate
2019-06-26 09:49:06.664 13506-13506/com.zitu.system I/AAt: -----onStart
2019-06-26 09:49:06.668 13506-13506/com.zitu.system I/AAt: -----onResume
2019-06-26 09:49:08.704 13506-13506/com.zitu.system I/AAt: -----onPause
2019-06-26 09:49:08.742 13506-13506/com.zitu.system I/BAt: ----onCreate
2019-06-26 09:49:08.743 13506-13506/com.zitu.system I/BAt: ----onStart
2019-06-26 09:49:08.746 13506-13506/com.zitu.system I/BAt: ----onResume
2019-06-26 09:49:08.963 13506-13506/com.zitu.system I/AAt: -----onStop
2019-06-26 09:49:10.649 13506-13506/com.zitu.system I/AAt: -----onDestroy
2019-06-26 09:49:10.656 13506-13506/com.zitu.system I/BAt: ----onPause
2019-06-26 09:49:10.715 13506-13506/com.zitu.system I/AAt: -----onCreate
2019-06-26 09:49:10.736 13506-13506/com.zitu.system I/AAt: -----onStart
2019-06-26 09:49:10.739 13506-13506/com.zitu.system I/AAt: -----onResume
2019-06-26 09:49:10.854 13506-13506/com.zitu.system I/BAt: -----onStop
2019-06-26 09:49:10.855 13506-13506/com.zitu.system I/BAt: -----onDestroy

可以看到此时所有的直接清空了,重建了,另外我们可以观察到他是先结束的A然后在结束的B<br />另外我们单独使用FLAG_ACTIVITY_CLEAR_TASK看看效果

2019-06-26 09:52:34.588 13763-13763/com.zitu.system I/AAt: -----onCreate
2019-06-26 09:52:34.616 13763-13763/com.zitu.system I/AAt: -----onStart
2019-06-26 09:52:34.621 13763-13763/com.zitu.system I/AAt: -----onResume
2019-06-26 09:52:36.394 13763-13763/com.zitu.system I/AAt: -----onPause
2019-06-26 09:52:36.432 13763-13763/com.zitu.system I/BAt: ----onCreate
2019-06-26 09:52:36.433 13763-13763/com.zitu.system I/BAt: ----onStart
2019-06-26 09:52:36.436 13763-13763/com.zitu.system I/BAt: ----onResume
2019-06-26 09:52:36.654 13763-13763/com.zitu.system I/AAt: -----onStop
2019-06-26 09:52:37.216 13763-13763/com.zitu.system I/BAt: ----onPause
2019-06-26 09:52:37.232 13763-13763/com.zitu.system I/AAt: -----onCreate
2019-06-26 09:52:37.252 13763-13763/com.zitu.system I/AAt: -----onStart
2019-06-26 09:52:37.254 13763-13763/com.zitu.system I/AAt: -----onResume
2019-06-26 09:52:37.461 13763-13763/com.zitu.system I/BAt: -----onStop

发现没有效果直接和standard一样,直接新建了AAt并没有清空之前的。

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