安卓:活動(dòng)的生命周期
在安卓中, 活動(dòng)的生命周期可以歸納為: 1條棧第喳、4種狀態(tài)赤套、7個(gè)狀態(tài)轉(zhuǎn)化回調(diào)函數(shù)抵知。
作者?Bryce Chen
0x00 返回棧
0x01 活動(dòng)狀態(tài)
0x02 狀態(tài)轉(zhuǎn)換的回調(diào)函數(shù)
0x03 例子
0x00 返回棧
棧是一種后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu)堤魁,每當(dāng)我們啟動(dòng)了一個(gè)新的活動(dòng)耕魄,它會(huì)在返回棧中入棧,并處于棧頂?shù)奈恢弥ぞ拧W匀坏厣静颍忍幱跅m數(shù)幕顒?dòng)會(huì)被新的活動(dòng)”壓住”。
而每當(dāng)我們按下Back鍵或調(diào)用finish()方法去銷毀一個(gè)活動(dòng)時(shí)愧怜,處于棧頂?shù)幕顒?dòng)會(huì)出棧呀页,這時(shí)前一個(gè)入棧的活動(dòng)就會(huì)重新登頂。
處于棧頂?shù)幕顒?dòng)會(huì)被顯示給用戶拥坛,提供可交互的操作狀態(tài)蓬蝶。
0x01 活動(dòng)狀態(tài)
1.運(yùn)行狀態(tài)
處于運(yùn)行狀態(tài)的活動(dòng),是擺在用戶面前的活動(dòng)猜惋。此時(shí)這個(gè)活動(dòng)處于可交互的狀態(tài)丸氛,能夠響應(yīng)用戶的觸摸操作。這時(shí)著摔,活動(dòng)在返回棧的位置就是棧頂缓窜。
2.暫停狀態(tài)
用戶可見(jiàn)的、卻不可交互的活動(dòng)谍咆,就處于暫停狀態(tài)禾锤。例如此時(shí)的棧頂是一個(gè)對(duì)話框形式的活動(dòng),由于它只會(huì)占用屏幕中間的部分區(qū)域卧波,所以底下那個(gè)活動(dòng)就是可見(jiàn)的。此時(shí)的活動(dòng)是不可交互的庇茫,換言之港粱,對(duì)用戶的觸摸點(diǎn)擊"沒(méi)有反應(yīng)”男旗。此時(shí)摄狱,活動(dòng)不在棧頂了。
3.停止?fàn)顟B(tài)
用戶對(duì)活動(dòng)完全不可見(jiàn)的時(shí)候歧蒋,活動(dòng)就進(jìn)入了停止?fàn)顟B(tài)宁炫〕ナ铮活動(dòng)需由暫停狀態(tài)進(jìn)入停止?fàn)顟B(tài)。很多時(shí)候是新的活動(dòng)完全覆蓋了原活動(dòng)羔巢,用戶感覺(jué)到了”頁(yè)面的切換"望忆,那么該活動(dòng)從運(yùn)行態(tài)罩阵,中間暫停態(tài)幾乎不停留,進(jìn)入到停止態(tài)启摄。
4.銷毀狀態(tài)
當(dāng)一個(gè)活動(dòng)從返回棧中移除后就變成了銷毀狀態(tài)稿壁。
0x02 狀態(tài)轉(zhuǎn)換的回調(diào)函數(shù)
1.onCreate()
這個(gè)函數(shù)在活動(dòng)第一次被創(chuàng)建的時(shí)候調(diào)用。一般在這個(gè)方法中完成活動(dòng)的初始化操作,比如說(shuō)加載布局歉备、綁定事件等傅是。
2.onStart()
這個(gè)方法在活動(dòng)新創(chuàng)建,第一次由不可見(jiàn)變?yōu)榭梢?jiàn)的時(shí)候調(diào)用蕾羊,活動(dòng)被啟動(dòng)了喧笔。
3.onRestart()
這個(gè)方法在活動(dòng)由不可見(jiàn)變?yōu)榭梢?jiàn)的時(shí)候調(diào)用,也就是停止?fàn)顟B(tài)變?yōu)檫\(yùn)行狀態(tài)之前調(diào)用龟再,即活動(dòng)被重新啟動(dòng)了书闸。
4.onResume()
這個(gè)方法在活動(dòng)準(zhǔn)備好和用戶進(jìn)行交互的時(shí)候調(diào)用。此時(shí)的活動(dòng)位于返回棧的棧頂,并且處于運(yùn)行狀態(tài)
5. onPause()
這個(gè)方法在活動(dòng)進(jìn)入不可交互的狀態(tài)的時(shí)候調(diào)用吸申,活動(dòng)由運(yùn)行狀態(tài)進(jìn)入暫停狀態(tài)梗劫。
6.onStop()
這個(gè)方法在活動(dòng)完全不可見(jiàn)的時(shí)候調(diào)用,活動(dòng)由暫停狀態(tài)進(jìn)入停止?fàn)顟B(tài)截碴。
7.onDestroy()
這個(gè)方法在活動(dòng)被銷毀之前調(diào)用,之后活動(dòng)的狀態(tài)將變?yōu)殇N毀狀態(tài)梳侨。
0x03 例子
在Android Studio中新建工程
新建MainActivity,改寫(xiě)以上7個(gè)回調(diào)方法日丹,分別在其中加入Log走哺,觀察函數(shù)的調(diào)用:
啟動(dòng)應(yīng)用
在控制臺(tái)的Logcat中看到,依次調(diào)用了onCreate()哲虾、onStart()丙躏、onResume() :
程序調(diào)用onCreate()的時(shí)間是 02:17:53.313,也就是進(jìn)入停止?fàn)顟B(tài)的時(shí)間點(diǎn)束凑。
可以看到依次調(diào)用的時(shí)間間隔非常短晒旅,僅為幾毫秒,該活動(dòng)在中間狀態(tài)(停止?fàn)顟B(tài) 2ms汪诉、暫停狀態(tài) 6ms)幾乎沒(méi)有停留的時(shí)間废恋,直奔運(yùn)行狀態(tài)。
退出應(yīng)用
點(diǎn)擊Back返回鍵:
查看Log
接著扒寄,依次調(diào)用了onPause()鱼鼓、onStop()、onDestroy():
程序調(diào)用onPause()的時(shí)間是 02:32:57.030该编,也就是進(jìn)入暫停狀態(tài)的時(shí)間點(diǎn)迄本。
活動(dòng)從運(yùn)行狀態(tài),在中間狀態(tài) (暫停狀態(tài)1020 ms课竣、停止?fàn)顟B(tài)不足1 ms)的停留時(shí)間不長(zhǎng)嘉赎,很快進(jìn)入了銷毀狀態(tài)置媳。
參考文獻(xiàn):《第一行代碼》(郭霖)?