Activity生命周期?
OnCreate() 當(dāng)前頁面被創(chuàng)建
onStart() 當(dāng)前頁面被啟動
onResume() 頁面可視 當(dāng)前頁面處于棧頂 可以看到 并且 可以與用戶進(jìn)行交互 就處于這個生命周期
OnPause() 在這個生命周期中 頁面可視 但是 被其他的有所遮擋 不可以與用戶交互 正在停止
onStop() 頁面不可見 即將被GC回收器回收 就處于這個生命周期
onDestory() 當(dāng)當(dāng)前界面被銷毀的時候就會走這個生命周期 此時當(dāng)前頁面已經(jīng)完全被銷毀 GC回收器已經(jīng)將其回收 做出了釋放
onRestart() 當(dāng)用戶按下返回鍵回到主頁面以后 再次進(jìn)入App 才會走onRestart
啟動一個Activity:onCreate-onStart-onResume
返回到主界面:onPause-onStop-onDestory
home鍵:onPause-onStop;????然后再次啟動:onRestart-onStart-onResume
從一個Activity跳轉(zhuǎn)到另一個Activity,第一個Activity:onPause-onStop,第二個Activity:onCreate-onStart-onResume
從第二個Activity返回到第一個Activity,第二個onPause-onStop-onDestory,第一個onRestart-onStart-onResume
橫豎屏切換:onPause-onStop-onDestory-onRestart-onStart-onResume
按下電源鍵:onPause-onStop
任務(wù)棧和啟動模式
當(dāng)我們每打開一個Activity的時候它會就往Activity任務(wù)棧中壓入一個Activity,當(dāng)我們每銷毀一個Activity的時候它會從Activity任務(wù)棧中彈出一個Activity,由于安卓系統(tǒng)自身的設(shè)計,我們只能在手機(jī)屏幕上獲取當(dāng)前一個Activity的焦點即棧頂元素(最上面的Activity),其余的Activity會暫居后臺等待系統(tǒng)調(diào)用。
關(guān)于任務(wù)棧的概念:
任務(wù)棧是用來提升體驗而設(shè)計的:
(1) 程序打開時就創(chuàng)建了一個任務(wù)棧, 用于存儲當(dāng)前程序的activity,當(dāng)前程序(包括被當(dāng)前程序所調(diào)用的)所有的activity屬于一個任務(wù)棧。
(2) 一個任務(wù)棧包含了一個activity的集合, 可以有序的選擇哪一個activity和用戶進(jìn)行交互,只有在任務(wù)棧棧頂?shù)腶ctivity才可以跟用戶進(jìn)行交互。
(3) 任務(wù)??梢砸苿拥胶笈_,并且保留了每一個activity的狀態(tài). 并且有序的給用戶列出它們的任務(wù), 而且還不丟失它們狀態(tài)信息。
(4) 退出應(yīng)用程序時,當(dāng)把所有的任務(wù)棧中所有的activity清除出棧時,任務(wù)棧會被銷毀,程序退出。
Activity的4種啟動方式
為了解決任務(wù)棧產(chǎn)生的問題,Android為Activity設(shè)計了啟動模式。
啟動模式(launchMode)在多個Activity跳轉(zhuǎn)的過程中扮演著重要的角色,它可以解決是否生成新的Activity實例,是否重用已經(jīng)存在的Activity實例,是否和其他實例共用一個任務(wù)棧。任務(wù)棧是一個具有棧結(jié)構(gòu)的對象,一個任務(wù)??梢怨芾矶鄠€Activity,每啟動一個應(yīng)用,也就創(chuàng)建一個與之對應(yīng)的任務(wù)棧。
Activity一共有以下四種launchMode模式:1、standard 2、singTop 3、singTask 4、singleInstance,我們可以在AndroidManifest.xml配置<activity>的android:launchMode屬性-為以上四種之一即可。
1?standard。在Activity啟動模式為standard(默認(rèn))的情況下,不管之前有沒有Activity實例,每一次啟動Activity都會創(chuàng)建一個新的Activity實例,并置于Activity任務(wù)棧棧頂。
2 singTop。在Activity啟動模式為singleTop(棧頂任務(wù)唯一)的情況下,如果當(dāng)前Activity處于棧頂,那么它就不會再去實例化一個新的Activity,當(dāng)Activity不處于棧頂?shù)臅r候,會重新實例化一個新的Activity并置于棧頂。
3 singTask。在Activity啟動模式為singleTask(唯一實例)的情況下,當(dāng)啟動Activity的時候,如果當(dāng)前Activity不存在則實例化一個新的Activity,如果當(dāng)前Activity在任務(wù)棧中已經(jīng)存在,則會復(fù)用這個Activity實例
4 singleInstance。和singleTask一樣保持唯一實例,然后它的退出順序是不再是根據(jù)調(diào)用順序,而是在不同的任務(wù)棧中,從上往下退出。
設(shè)置啟動模式設(shè)置啟動模式的方法有兩種
?- 通過在AndroidMainifest文件中的屬性 android:launchMode 來設(shè)置Activity的啟動模式
?- 通過設(shè)置Intent的Flag來設(shè)置一個Activity的啟動模式
Intent.FLAG_ACTIVITY_NEW_TASK 創(chuàng)建一個新的Task來啟動一個Activity,但啟動的每個Activity都將在一個新的Task中,該Flag通常使用于從service中啟動Activity的場景。 - Intent.FLAG_ACTIVITY_SINGLE_TOP 使用singletop的模式來啟動一個Activity - Intent.FLAG_ACTIVITY_CLEAR_TOP 使用singleTask模式來啟動一個Activity - Intent.FLAG_ACTIVITY_NO_HISTORY 使用這種模式啟動Activity,當(dāng)該Activity啟動其他Activity后,該Activity就會消失,不會保留在Activity棧中。 如A-B,B以這種模式啟動C,C啟動D,則當(dāng)前Activity棧中只有ABD。?