? ? ? ?首先簡(jiǎn)單說(shuō)一下什么是Activity漱办?Activity是Android四大組件之一花盐,我們主要通過(guò)Activity來(lái)顯示我們的UI狗超,方便用戶操作瞳腌。一個(gè)app中會(huì)有多個(gè)activity,當(dāng)啟動(dòng)新的activity時(shí),當(dāng)前activity會(huì)停止囱嫩,新的activity會(huì)進(jìn)入棧中嗅辣,獲取用戶焦點(diǎn)。當(dāng)用戶按“返回”按鈕時(shí)挠说,當(dāng)前activity銷毀澡谭,前一個(gè)activity重新恢復(fù)。
Activity 的生命周期:
activity的四種狀態(tài):
(1)運(yùn)行狀態(tài):當(dāng)一個(gè)活動(dòng)位于返回棧的棧頂時(shí)损俭,用戶可以獲取焦點(diǎn)做出操作蛙奖,系統(tǒng)一般不會(huì)回收這個(gè)狀態(tài)。
(2)暫停狀態(tài):彈出一個(gè)活動(dòng)或者一個(gè)非全屏的activity時(shí)杆兵,就會(huì)讓前一個(gè)activity處于pause狀態(tài)雁仲。這時(shí)activity就不會(huì)處于棧頂,但是仍然可見琐脏,只不過(guò)用戶無(wú)法操作攒砖。系統(tǒng)也一般不會(huì)回收這樣的活動(dòng),除非內(nèi)存占用過(guò)大日裙。
(3)停止?fàn)顟B(tài):當(dāng)一個(gè)活動(dòng)不處于棧頂位置吹艇,且完全不可見的時(shí)候,就進(jìn)入停止?fàn)顟B(tài)昂拂,當(dāng)內(nèi)存較低時(shí)系統(tǒng)會(huì)回收這樣的活動(dòng)
(4)銷毀狀態(tài):當(dāng)一個(gè)活動(dòng)從棧中移除后就編程銷毀狀態(tài)受神,系統(tǒng)會(huì)回收這樣的活動(dòng),狀態(tài)信息和成員變量都已經(jīng)不存在了
大致流程可以分為:
.Activity啟動(dòng) -->? onCreate() --> onStart() --> onResume()
2.點(diǎn)擊Home鍵回到系統(tǒng)主界面的時(shí)候 --> onPause() --> onStop()
3.當(dāng)我們?cè)俅位氐皆瓉?lái)的那個(gè)Activity的時(shí)候 --> onRestart() --> onStart() --> onResume()
4.退出當(dāng)前的Activity的時(shí)候 --> onPause() --> onStop() --> onDestory()
5.A Activity 調(diào)用彈出B Activity的時(shí)候(完全覆蓋) --> A onPause() --> B onCreate() --> B onStart() --> B onResume --> A onStop()
6.Activity異常退出的時(shí)候 --> onPause() --> onSaveInstanceState() --> onStop() --> onDestory(),
需要注意的是onSaveInstanceState() 方法與onPause并沒(méi)有嚴(yán)格的先后關(guān)系格侯,有可能在onPause之前鼻听,也有可能在其后面調(diào)用,但會(huì)在onStop()方法之前調(diào)用
7.異常退出后又重新啟動(dòng)該Activity --> onCreate() --> onStart() --> onRestoreInstanceState() --> onResume()
2)啟動(dòng)模式
為什么要有啟動(dòng)模式联四?
我們?cè)陂_發(fā)項(xiàng)目的過(guò)程中撑碴,一般都需要在本應(yīng)用中多個(gè)Activity組件之間的跳轉(zhuǎn),也可能需要在本應(yīng)用中打開其它應(yīng)用的可復(fù)用的Activity朝墩。如我們可能需要跳轉(zhuǎn)到原來(lái)某個(gè)Activity實(shí)例醉拓,此時(shí)我們更希望這個(gè)Activity可以被重用而不是創(chuàng)建一個(gè)新的 Activity,但根據(jù)Android系統(tǒng)的默認(rèn)行為鱼辙,確實(shí)每次都會(huì)為我們創(chuàng)建一個(gè)新的Activity并添加到Task中廉嚼,這樣android系統(tǒng)是不是很傻玫镐?還有一點(diǎn)就是在我們每開啟一次頁(yè)面加入到任務(wù)棧Task中后倒戏,一個(gè)Activity的數(shù)據(jù)和信息狀態(tài)都將會(huì)被保留,這樣會(huì)造成數(shù)據(jù)冗余, 重復(fù)數(shù)據(jù)太多, 最終還可能導(dǎo)致內(nèi)存溢出的問(wèn)題(OOM)恐似。為了解決這些問(wèn)題杜跷,android系統(tǒng)提供了一套Activity的啟動(dòng)模式來(lái)修改系統(tǒng)Activity的默認(rèn)啟動(dòng)行為。
a)standard,標(biāo)準(zhǔn)模式,也是系統(tǒng)的默認(rèn)模式(可以不指定)葛闷,在這樣模式下憋槐,每啟動(dòng)一個(gè)Activity都會(huì)重新創(chuàng)建一個(gè)Activity的新實(shí)例,并且將其加入任務(wù)棧中淑趾,而且完全不會(huì)去考慮這個(gè)實(shí)例是否已存在
b)singleTop,棧頂復(fù)用模式阳仔,顧名思義,在這種模式下扣泊,如果有新的Activity已經(jīng)存在任務(wù)棧的棧頂近范,那么此Activity就不會(huì)被重新創(chuàng)建新實(shí)例,而是復(fù)用已存在任務(wù)棧棧頂?shù)腁ctivity延蟹。這里重點(diǎn)是位于棧頂评矩,才會(huì)被復(fù)用,如果新的Activity的實(shí)例已存在但沒(méi)有位于棧頂阱飘,那么新的Activity仍然會(huì)被重建斥杜。需要注意的是,Activity的onNewIntent方法會(huì)被調(diào)用
c)singleTask,棧內(nèi)復(fù)用模式沥匈。這是一種單例模式蔗喂,與singTop點(diǎn)類似,只不過(guò)singTop是檢測(cè)棧頂元素是否有需要啟動(dòng)的Activity高帖,而singTask則是檢測(cè)整個(gè)棧中是否存在當(dāng)前需要啟動(dòng)的Activity弱恒,如果存在就直接將該Activity置于棧頂,并將該Activity以上的Activity都從任務(wù)棧中移出銷毀棋恼,同時(shí)也會(huì)回調(diào)onNewIntent方法
d)singleInstance模式下返弹,該Activity在整個(gè)android系統(tǒng)內(nèi)存中有且只有一個(gè)實(shí)例,而且該實(shí)例單獨(dú)尊享一個(gè)Task爪飘。換句話說(shuō)义起,A應(yīng)用需要啟動(dòng)的MainActivity 是singleInstance模式,當(dāng)A啟動(dòng)后师崎,系統(tǒng)會(huì)為它創(chuàng)建一個(gè)新的任務(wù)棧默终,然后A單獨(dú)在這個(gè)新的任務(wù)棧中,如果此時(shí)B應(yīng)用也要激活MainActivity犁罩,由于棧內(nèi)復(fù)用的特性齐蔽,則不會(huì)重新創(chuàng)建,而是兩個(gè)應(yīng)用共享一個(gè)Activity的實(shí)例
3)startActivityForResult和啟動(dòng)模式
startActivityForResult方法能夠起效:standard和singleTop
startActivityForResult方法不能夠起效:singleTask和singleInstance
1)只要將被啟動(dòng)的Activity屬性設(shè)置為singleTask則一定不起效
2)只要將被啟動(dòng)的Activity屬性設(shè)置為singleInstance則一定不起效
3)只要將啟動(dòng)的Activity模式設(shè)置為singleInstance則不論被啟動(dòng)的Activity為什么模式均不起效