android生命周期,启动模式,flags
Activity 生命周期
从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并没有清空之前的。