android生命周期法竞,啟動(dòng)模式榜揖,flags
Activity 生命周期
從ActivityA 啟動(dòng)到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
注意當(dāng)B Activity 開始調(diào)用onResume的時(shí)候A Activity開始調(diào)用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
注意當(dāng)A Activity 開始調(diào)用onResume的時(shí)候B Activity開始調(diào)用onstop和onDestory<br />注意這個(gè)時(shí)候不會(huì)走onNewIntent();
<a name="RNdgk"></a>
啟動(dòng)模式結(jié)合生命周期
四種啟動(dòng)模式
- standard 標(biāo)準(zhǔn)模式,每次都新建一個(gè)實(shí)例對(duì)象
- singleTop 如果在任務(wù)棧頂發(fā)現(xiàn)了相同的實(shí)例則重用鸽素,否則新建并壓入棧頂
- singleTask 如果在任務(wù)棧中發(fā)現(xiàn)了相同的實(shí)例褒繁,將其上面的任務(wù)終止并移除,重用該實(shí)例馍忽。否則新建實(shí)例并入棧
- singleInstance 允許不同應(yīng)用棒坏,進(jìn)程線程等共用一個(gè)實(shí)例燕差,無論從何應(yīng)用調(diào)用該實(shí)例都重用
standard
每次都會(huì)新建,這里不具體描述坝冕,默認(rèn)為該模式
singleTop
等同于flag=FLAG_ACTIVITY_SINGLE_TOP<br />啟動(dòng)activity A 在A中啟動(dòng) Activity B 在B中啟動(dòng)A 此時(shí)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
此時(shí)B未重建徒探,直接復(fù)用了之前的B
singleTask
啟動(dòng)activity A 在A中啟動(dòng) Activity B 在B中啟動(dòng)A 其中 Activity A 在mainfest的設(shè)置如下
<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
不會(huì)重建直接復(fù)用了
singleInstance
三個(gè)實(shí)驗(yàn)
第一個(gè):?jiǎn)?dòng)ActivityA 在A中啟動(dòng)ActivityB 在B中啟動(dòng)ActivityC B的啟動(dòng)方式為singleInstance此時(shí)按返回鍵 返回的順序是C ->A->B 通過log我們發(fā)現(xiàn)A和C是同一個(gè)任務(wù)棧,B我單獨(dú)一個(gè)任務(wù)棧
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
第二個(gè)實(shí)驗(yàn):?jiǎn)?dòng)ActivityA 在A中啟動(dòng)ActivityB B的啟動(dòng)方式為singleInstance<br />此時(shí)按Home 再次點(diǎn)擊進(jìn)入的時(shí)候此時(shí)顯示的是A界面 因?yàn)閼?yīng)該的主任務(wù)棧為A所在的任務(wù)棧喂窟,所有會(huì)優(yōu)先選擇A
第三個(gè)實(shí)驗(yàn):?jiǎn)?dòng)ActivityA 在A中啟動(dòng)ActivityB 在B中再次啟動(dòng)B B的啟動(dòng)方式為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
我們發(fā)現(xiàn)此時(shí)B未重建直接復(fù)用了之前的测暗,是不是單列模式很像。
<a name="GROF6"></a>
啟動(dòng)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兩者同時(shí)使用磨澡,等同于FLAG_ACTIVITY_CLEAR_TOP
-
FLAG_ACTIVITY_CLEAR_TASK 會(huì)清空掉所有的activity必須和 FLAG_ACTIVITY_NEW_TASK一起使用
<a name="p6wUC"></a>
FLAG_ACTIVITY_CLEAR_TOP
啟動(dòng)activity A 在A中啟動(dòng) Activity B 在B中啟動(dòng)A 此時(shí)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
在上下文中啟動(dòng)activity必須加該標(biāo)記稳摄,同一個(gè)應(yīng)用如果不設(shè)置taskid 的話稚字,都是相同的。<br />否則需要設(shè)置taskAffinity屬性
<a name="rdoe0"></a>
FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_NEW_TASK一起使用效果等同于單獨(dú)使用FLAG_ACTIVITY_CLEAR_TOP
啟動(dòng)activity A 在A中啟動(dòng) Activity B 在B中啟動(dòng)A 此時(shí)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
可以看到這個(gè)時(shí)候直接A的話直接也是重建了
FLAG_ACTIVITY_CLEAR_TASK
啟動(dòng)activity A 在A中啟動(dòng) Activity B 在B中啟動(dòng)A 此時(shí)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
可以看到此時(shí)所有的直接清空了厦酬,重建了胆描,另外我們可以觀察到他是先結(jié)束的A然后在結(jié)束的B<br />另外我們單獨(dú)使用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
發(fā)現(xiàn)沒有效果直接和standard一樣,直接新建了AAt并沒有清空之前的弃锐。