Android入門教程之組件Activity的生命周期詳解
返回棧
Android 中的 Activity 是可以層疊的,我們每啟動一個(gè)新的 Activity,就會覆蓋在原有的 Activity 之上,然后點(diǎn)擊 Back 鍵會銷毀最上面的 Activity,下面的一個(gè) Activity 就會重新顯示出來
其實(shí) Android 是使用任務(wù)(task)來管理 Activity 的,一個(gè)任務(wù)就是一組存放在棧里的 Activity 的集合,這個(gè)棧也被稱作返回棧
默認(rèn)情況下,啟動一個(gè)新的 Activity,它就會在返回棧中入棧,并處于棧頂?shù)奈恢?。而每?dāng)我們按下 Back 鍵或調(diào)用 finish() 方法銷毀一個(gè) Activity 時(shí),處于棧頂?shù)?Activity 就會出棧,前一個(gè)入棧的 Activity 就會重新處于棧頂?shù)奈恢?。系統(tǒng)總是會顯示處于棧頂?shù)?Activity 給用戶
Activity 狀態(tài)
每個(gè) Activity 在其生命周期中最多可能有四種狀態(tài):
1. 運(yùn)行狀態(tài)
當(dāng)一個(gè) Activity 位于返回棧的棧頂時(shí),Activity 就處于運(yùn)行狀態(tài)
2. 暫停狀態(tài)
當(dāng)一個(gè) Activity 不再處于棧頂位置,但仍然可見時(shí),Activity 就進(jìn)入了暫停狀態(tài)
3. 停止?fàn)顟B(tài)
當(dāng)一個(gè) Activity 不再處于棧頂位置,并且完全不可見時(shí),就進(jìn)入了停止?fàn)顟B(tài)
4. 銷毀狀態(tài)
一個(gè) Activity 從返回棧中移除后就變成了銷毀狀態(tài)
Activity 的生存期
Activity 類中定義了七個(gè)回調(diào)方法,覆蓋了 Activity 生命周期的每一個(gè)環(huán)節(jié):
onCreate()
它會在 Activity 第一次被創(chuàng)建時(shí)調(diào)用,可以在這個(gè)方法中完成 Activity 的初始化操作,比如加載布局、綁定事件等
onStart()
這個(gè)方法在 Activity 由不可見變?yōu)榭梢姷臅r(shí)候調(diào)用
onResume()
這個(gè)方法在 Activity 準(zhǔn)備好和用戶進(jìn)行交互時(shí)調(diào)用,此時(shí)的 Activity 一定位于返回棧的棧頂,并且處于運(yùn)行狀態(tài)
onPause()
這個(gè)方法在系統(tǒng)準(zhǔn)備去啟動或者恢復(fù)另一個(gè) Activity 的時(shí)候調(diào)用,我們通常會在這個(gè)方法將一些消耗 CPU 的資源釋放掉,以及保存一些關(guān)鍵數(shù)據(jù),但這個(gè)方法的執(zhí)行速度一定要快,不然會影響到新的棧頂 Activity 的使用
onStop()
這個(gè)方法在 Activity 完全不可見的時(shí)候調(diào)用,它和 onPause() 方法的主要區(qū)別在于,如果啟動的新的 Activity 是一個(gè)對話框式的 Activity,那么 onPause() 方法會得到執(zhí)行,而 onStop() 方法并不會執(zhí)行
onDestroy()
這個(gè)方法在 Activity 被銷毀之前調(diào)用,之后 Activity 的狀態(tài)將變?yōu)殇N毀狀態(tài)
onRestart()
這個(gè)方法在 Activity 由停止?fàn)顟B(tài)變?yōu)檫\(yùn)行狀態(tài)之前調(diào)用,也就是 Activity 被重新啟動了
以上七個(gè)方法中除了 onRestart() 方法,其他都是兩兩相對的,從而又可以將 Activity 分為以下三種生存期:
完整生存期
Activity 在 onCreate() 方法和 onDestroy() 方法之間所經(jīng)歷的就是完整生存期。一般情況下,一個(gè) Activity 會在 onCreate() 方法中完成各種初始化操作,而在 onDestroy() 方法中完成釋放內(nèi)存的操作
可見生存期
Activity 在 onStart() 方法和 onStop() 方法之間所經(jīng)歷的就是可見生存期。在可見生存期內(nèi),Activity 對于用戶總是可見的,即便有可能無法和用戶進(jìn)行交互。我們可以通過這兩個(gè)方法合理地管理那些對用戶可見的資源。比如在 onStart() 方法中對資源進(jìn)行加載,而在 onStop() 方法中對資源進(jìn)行釋放,從而保證處于停止?fàn)顟B(tài)的 Activity 不會占用過多內(nèi)存
前臺生存期
Activity 在 onResume() 方法和 onPause() 方法之間所經(jīng)歷的就是前臺生存期。在前臺生存期內(nèi),Activity 總是運(yùn)行狀態(tài),此時(shí)的 Activity 是可以和用戶進(jìn)行交互的,我們平時(shí)看到的和接觸最多的就是這個(gè)狀態(tài)下的 Activity
Activity 回收處理
當(dāng)一個(gè) Activity 進(jìn)入了停止?fàn)顟B(tài),是有可能被系統(tǒng)回收的。如果一個(gè) Activity 由于系統(tǒng)內(nèi)存不足而被回收,用戶再返回該 Activity 時(shí),其實(shí)還是會正常顯示的,但這時(shí)并不會執(zhí)行 onRestart() 方法,而是會執(zhí)行 Activity 的 onCreate() 方法,因?yàn)?Activity 在這種情況下會被重新創(chuàng)建一次
如果 Activity 存在臨時(shí)數(shù)據(jù)和狀態(tài),比如文本輸入框已經(jīng)輸入了一段文字,回來以后文字都沒了,那這是比較影響用戶體驗(yàn)的。Activity 提供了一個(gè) onSaveInstanceState() 回調(diào)方法,該方法可以保證在 Activity 被回收之前一定會被調(diào)用,可以通過這個(gè)方法來解決這個(gè)問題
onSaveInstanceState() 方法會攜帶一個(gè) Bundle 類型的參數(shù),Bundle 提供了一系列的方法用于保存數(shù)據(jù)
override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) var tempData = "Something you just typed" outState.putString("data_key", tempData) }
數(shù)據(jù)保存以后,在 onCreate() 方法有一個(gè) Bundle 類型參數(shù),該參數(shù)帶有之前保存的全部數(shù)據(jù),只需再通過相應(yīng)的取值方法將數(shù)據(jù)取出即可
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) if (savedInstanceState != null) { val tempData = savedInstanceState.getString("data_key") } }
到此這篇關(guān)于Android入門教程之組件Activity的生命周期詳解的文章就介紹到這了,更多相關(guān)Android Activity內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
android實(shí)現(xiàn)上傳本地圖片到網(wǎng)絡(luò)功能
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)上傳本地圖片到網(wǎng)絡(luò)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09Android Flutter實(shí)現(xiàn)淘寶App的搜索推薦
這篇文章主要為大家詳細(xì)介紹了Android?Flutter如何模擬實(shí)現(xiàn)淘寶App的搜索推薦,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的可以了解一下2023-07-07Android 實(shí)現(xiàn)手機(jī)撥打電話的功能
本篇文章主要介紹 Android 開發(fā)手機(jī)撥打電話的功能,這里提供示例代碼,有興趣的小伙伴可以參考下2016-08-08Android的Service應(yīng)用程序組件基本編寫方法
Service是一個(gè)android 系統(tǒng)中的應(yīng)用程序組件,它跟Activity的級別差不多,但是他沒有圖形化界面,不能自己運(yùn)行,只能后臺運(yùn)行,Service通常用來處理一些耗時(shí)比較長的操作2012-12-12