這里是對(duì)Activity一些基礎(chǔ)知識(shí)的總結(jié),有問(wèn)題歡迎指正瘤载,有遺漏的地方否灾,歡迎補(bǔ)充。
PS:我是現(xiàn)在從事游戲開(kāi)發(fā)鸣奔,比較喜歡Android墨技,想以后有機(jī)會(huì)做Android開(kāi)發(fā)!
Activity的生命周期
這里主要是參考了這位同學(xué)的博客挎狸,然后我本地調(diào)試了一下扣汪。
public class OurActivity extends Activity {
protected void onCreate(Bundle savedInstanceState);
protected void onStart();
protected void onResume();
protected void onPause();
protected void onStop();
protected void onDestroy();
}
-
onCreate(Bundle savedInstanceState)
Activity處于不可視化,在這個(gè)過(guò)程中主要是一些數(shù)據(jù)锨匆,視圖資源的初始化工作崭别。 -
onStart()
Activity從不可視化到可視化狀態(tài)的過(guò)程,讓Activity在后臺(tái)顯示恐锣。 -
onResume()
這個(gè)方法執(zhí)行完成以后已經(jīng)在前臺(tái)顯示茅主,可以進(jìn)行用戶交互。 -
onPause()
Activity正在停止土榴,一般會(huì)緊接著onStop()诀姚。 -
onStop()
Activity即將停止。 -
onDestroy()
Activity從即將被銷毀玷禽,可以在這里做一些回收工作和最終資源釋放赫段。
- 當(dāng)Activity切換到桌面再回到Activity:onPause()→onStop()→onRestart()→onStart()→onResume()
當(dāng)Aty1切換到Aty2過(guò)程:onPause_1()→onCreate_2()→onStart_2()→onResume_2()→onStop_1(),這個(gè)過(guò)程需要注意的就是onPause_1()中不能做耗時(shí)操作
當(dāng)手機(jī)橫豎屏切換的時(shí)候:onPause()→onStop()→onDestroy()→onCreate()→onStart()→onResume()**
銷毀:當(dāng)系統(tǒng)配置發(fā)生改變后,Activity會(huì)被銷毀矢赁,其onPause,onStop,onDestroy方法都會(huì)調(diào)用糯笙,由于是異常狀態(tài)下終止,所以會(huì)調(diào)用onSaveInstanceState方法來(lái)保存當(dāng)前Activity的狀態(tài)(視圖結(jié)構(gòu)撩银、輸入的數(shù)據(jù)给涕、ListView滾動(dòng)的位置等);這個(gè)方法的調(diào)用時(shí)機(jī)是在onStop之前,可能在onPause之前或之后稠炬。
恢復(fù):重新創(chuàng)建時(shí)會(huì)調(diào)用onRestoreInstanceState焕阿,把剛剛onSaveInstanceState方法所保存的Bundle對(duì)象傳遞給onRestoreInstanceState和onCreate方法咪啡。onRestoreInstance發(fā)生在onStart之后首启。
Activity的加載模式
首先在看加載模式之前,我們需要先了解一下Task和Back Stack撤摸。關(guān)于這一塊的詳細(xì)講解請(qǐng)看這位同學(xué)的博客,已經(jīng)分析的相當(dāng)透徹毅桃!
- Task基本工作原理介紹:Task是我們?cè)谕瓿赡稠?xiàng)工作時(shí)所交互的Activity的集合。這些Activity按照打開(kāi)的順序被放置在同一個(gè)棧中准夷,這個(gè)棧被稱為Back Stack钥飞。當(dāng)我們點(diǎn)擊桌面上的launcher圖標(biāo)時(shí),對(duì)應(yīng)的Task會(huì)被置換到前臺(tái)衫嵌。如果這個(gè)應(yīng)用不存在Task读宙,就會(huì)創(chuàng)建一個(gè)新的Task,此時(shí)應(yīng)用的MainActivity就會(huì)被創(chuàng)建楔绞,壓入Back Stack中结闸。當(dāng)從當(dāng)前Activity啟動(dòng)到一個(gè)新的Activity的時(shí)候,新的Activity會(huì)被壓入棧中酒朵,之前的Activity會(huì)處于停止?fàn)顟B(tài)桦锄。當(dāng)我們按返回鍵時(shí),新的Activity會(huì)被出棧并銷毀蔫耽,之前的Activity會(huì)恢復(fù)狀態(tài)结耀。當(dāng)我們按返回鍵回到桌面,此時(shí)所有的Activity已經(jīng)出棧匙铡,然后Task被銷毀图甜。
- 保存Activity的狀態(tài):當(dāng)Activity停止(Stoped)時(shí),系統(tǒng)會(huì)默認(rèn)保存其狀態(tài)鳖眼。當(dāng)我們通過(guò)back鍵返回到這個(gè)Activity的時(shí)候就會(huì)恢復(fù)到離開(kāi)時(shí)的界面具则。當(dāng)然,也會(huì)存在多個(gè)Task同時(shí)存在的情況具帮,內(nèi)存緊張時(shí)可能會(huì)銷毀后臺(tái)的Activity博肋,回收內(nèi)存。在這種情況下蜂厅,系統(tǒng)仍然會(huì)知道Activity在Task中的位置匪凡,當(dāng)通過(guò)back鍵回到這個(gè)Activity時(shí),系統(tǒng)會(huì)重新創(chuàng)建一個(gè)Activity掘猿,而不是之前那種Resume病游。因此,為了不丟失Activity的內(nèi)容,可以通過(guò)實(shí)現(xiàn)onSaveInstanceState()方法主動(dòng)保存數(shù)據(jù)衬衬,但是值得一提的是onSaveInstanceState()在我們一直按back鍵退出的時(shí)候买猖,是不會(huì)調(diào)用的,因此一些永久性的數(shù)據(jù)需要用onPause()方法保存滋尉。
加載模式:
- 設(shè)置一個(gè)launchMode玉控,兩種方法:
- 可以直接在AndroidManifest.xml <activity>標(biāo)簽的一個(gè)屬性中設(shè)置launchMode,如下:
<activity
android:name=".SingleTaskActivity"
android:label="singleTask launchMode"
android:launchMode="singleTask">
- 通過(guò)叫做 Intent addFlags方法設(shè)置更多的行為狮惜,比如:
Intent intent = new Intent(StandardActivity.this, StandardActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
- Activity的四種啟動(dòng)模式:
standard:Activity的默認(rèn)啟動(dòng)方式高诺。啟動(dòng)的Activity都會(huì)壓進(jìn)上面所說(shuō)的Back Stack中。這種方式啟動(dòng)Activity每次都會(huì)創(chuàng)建一個(gè)新的Activity實(shí)例碾篡。
singleTop:對(duì)應(yīng)的Flags為FLAG_ACTIVITY_SINGLE_TOP虱而。啟動(dòng)Activity之前,都會(huì)先判斷Back Stack頂部的Activity是不是要啟動(dòng)的Activity开泽。如果不是牡拇,則新創(chuàng)建一個(gè)新的Activity。如果是穆律,則直接引用惠呼,但是會(huì)在Activity啟動(dòng)的時(shí)候調(diào)用onNewIntent()方法。此時(shí)這個(gè)Activity生命周期方法為onNewIntent()→onRestart()→onStart()→onResume()众旗,因此如果遇到這種情況罢杉,我們應(yīng)該在onNewIntent()做對(duì)應(yīng)的數(shù)據(jù)處理方法。但是贡歧,需要注意的是系統(tǒng)隨時(shí)可能殺死后臺(tái)運(yùn)行的Activity滩租,如果對(duì)應(yīng)的Activity被殺死了,那么系統(tǒng)就不會(huì)調(diào)用上面說(shuō)的onNewIntent()利朵,而是調(diào)用onCreate()方法律想。所以為了保險(xiǎn)起見(jiàn)最好在onCreate()中也要有相同邏輯的初始化方法。
singleTask:對(duì)應(yīng)的Flags為FLAG_ACTIVITY_NEW_TASK绍弟。如果當(dāng)前要啟動(dòng)的Activity已經(jīng)存在于Back Stack中(之前已經(jīng)創(chuàng)建了一個(gè)對(duì)應(yīng)的Activity的實(shí)例)技即,會(huì)直接使用已經(jīng)存在的Activity,并且把它上面的活動(dòng)都給彈出樟遣。如果沒(méi)有則創(chuàng)建一個(gè)新的活動(dòng)實(shí)例而叼。
singleInstance:聲明為singleInstance的Activity會(huì)出現(xiàn)在一個(gè)新的任務(wù)棧中,而且該任務(wù)棧中只存在這一個(gè)Activity豹悬。除非這個(gè)任務(wù)棧被銷毀了葵陵,否則后續(xù)的請(qǐng)求均不會(huì)創(chuàng)建新的實(shí)例。每個(gè)Activity都有一個(gè)自己的任務(wù)棧瞻佛,除了singleInstance脱篙,剩下的啟動(dòng)模式下,Activity都是被保存在了自己App的任務(wù)棧里