Activity生命周期
接口函數(shù) | 介紹 |
---|---|
onCreate | 當(dāng)Activity第一次創(chuàng)建的時候調(diào)用初橘。這個方法里主要是提供給我們做一些初始化操作,如:創(chuàng)建view充岛、綁定數(shù)據(jù)到view保檐。同時這個方法里還帶有一個Bundle參數(shù),這個參數(shù)的主要的用途會在后面的onSavedInstanceState方法的介紹里再來講解裸准。 |
onStart | 緊接著onCreate方法執(zhí)行的是onStart方法,該方法的執(zhí)行表示Activity已經(jīng)顯示了但是還無法和用戶交互赔硫,只有當(dāng)執(zhí)行到onResume方法的時候才可以進(jìn)行交互炒俱。另 |
onResume | 調(diào)用到onResume方法后,Activity就可以與用戶開始進(jìn)行交互了,此時Activity就會位于Activity棧的棧頂了爪膊。 |
onPause | 當(dāng)系統(tǒng)開始準(zhǔn)備停止當(dāng)前Activity的時候調(diào)用权悟,在該方法中g(shù)oogle給出的建議是存儲一些變化的數(shù)據(jù)同時停止一些類似于動畫等消耗CPU的工作。該方法的調(diào)用過程是很快的推盛,否則會影響到后面的Activity的現(xiàn)實峦阁,所以在該方法里不宜做過多耗時操作。 |
onStop | 緊接著onPause方法調(diào)用耘成,此時Activity已經(jīng)不再顯示在用戶面前了,此時新的Activity可能已經(jīng)執(zhí)行到onStart方法或者onResume方法了榔昔,所以此時可做一些較為重量級回收操作比方說關(guān)于數(shù)據(jù)庫的一些讀寫操作等驹闰。 |
onRestart | onStop方法之后可能會調(diào)用到onRestart方法,這是因為代表的Activity正在被重新啟動撒会,然后緊接著就會繼續(xù)走到onStart和onResume方法中嘹朗。 |
onDestroy | 該方法表示Activity生命周期中的最后一個方法,表示Activity方法將會被銷毀诵肛,此時我們可以做一些回收操作屹培。這里需要提到的一點是,即使一個Activity被銷毀后app內(nèi)部的static變量是不會被銷毀的怔檩,因為static變量是全局的褪秀,activity銷毀但是該app的進(jìn)程并沒有被殺死。所以說這一點尤為需要注意我們的static變量的使用薛训,否則稍有不慎再次啟動該activity的時候該static變量就會是一個dirty data! |
與生命周期相關(guān)的一些方法
onSaveInstanceState與onRestoreInstanceState方法
onCreate執(zhí)行的時候媒吗,方法中帶有一個Bundle參數(shù),在正常啟動Activity的時候打印這個參數(shù)會發(fā)先它是為null的许蓖。
查看google文檔可以發(fā)現(xiàn)蝴猪,這個參數(shù)只有當(dāng)Activity重新初始化的時候才不會為null。
那么什么叫重新初始化呢膊爪?
舉一個簡單的例子自阱,比方說手機(jī)橫豎屏切換的時候如果我們沒有在manifest文件的configchange屬性里指定orientation|screenSize。
在android4.0以上必須同時指定這兩個屬性米酬,如果只寫orientation不生效沛豌。
就會在onPause之后調(diào)用到onSaveInstanceState(Bundle)方法,此時我們就可以往Bundle里存儲一些數(shù)據(jù)赃额,隨后系統(tǒng)會殺死Activity然后再重啟它加派,此時我們發(fā)現(xiàn)onCreate方法中的Bundle參數(shù)不為空。
Activity的啟動模式
Android應(yīng)用程序都是由一個或多個Activity組成的跳芳,而Android內(nèi)部則是通過棧來對Activity進(jìn)行管理的芍锦。所謂棧就是一個先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu)。
正常情況下棧頂?shù)腁ctivity就是當(dāng)前Task顯示的Activity飞盆,當(dāng)我們按back鍵的時候該Activity便會出棧娄琉。
然而事實并不是這么簡單,google在對Activity任務(wù)棧進(jìn)行設(shè)計的時候考慮到了一些特殊需求所以便有了Activity的啟動模式吓歇。
Activity的啟動模式包含四種孽水,分別是:standard、singleTop城看、singleTask女气、singleInstance,我們可以在manifest里通過Activity的launchmode進(jìn)行指定测柠。
standard模式
Activity的標(biāo)準(zhǔn)啟動模式炼鞠,如果我們不對Activity做任何特殊處理的情況下就默認(rèn)為該模式啟動缘滥。
這個模式會導(dǎo)致一個任務(wù)棧里有多個該Activity的實例存在,很簡單的一個例子就是我們在AcitivytA里啟動ActivityA這樣就會有兩個ActivityA存在簇搅。
假如說該Activity非常消耗資源完域,那么就有必要考慮下更改下Activity的啟動模式了。
singleTop模式
簡單來說瘩将,啟動的Activity已經(jīng)在任務(wù)棧的棧頂話吟税,那么再啟動這個Activity的時候就不會創(chuàng)建該實例,同時會調(diào)用該Acitivity的onNewIntent方法(前面有提過該方法)姿现。
但是如果該Activity不在棧定的話肠仪,那么啟動它的行為與standard模式并沒有什么區(qū)別。
singleTask模式
singleTask指的是一個任務(wù)棧中只能存在一個這樣的Acitivity备典。
如果任務(wù)棧中沒有該Activity的話系統(tǒng)就會創(chuàng)建一個Acitivity壓入棧頂异旧,但是如果存在該Activity的話就會銷毀壓在該Activity上的所有Activity最終讓創(chuàng)建出來的Activity實例處于棧頂,同時也會回掉該Activity的onNewIntent方法提佣。
singleInstance模式
四個模式當(dāng)中最為特殊的一個吮蛹,設(shè)置了該模式啟動的Acitivyt會在一個獨立的任務(wù)棧中開啟,該任務(wù)棧有且只有一個這樣的Activity實例拌屏,每次再啟動這個Activity的時候就會在該任務(wù)棧里重用該Activity同時回掉onNewIntent方法潮针。
singleInstace與singleTask的區(qū)別在于:singleTask啟動的Activity在系統(tǒng)層面上來說是可以有多個實例的。
比如說應(yīng)用程序A想調(diào)用singleInstance模式下的ActivityA,而應(yīng)用程序B也同樣調(diào)用了倚喂,那么在應(yīng)用程序A和B中就會各有一個ActivityA的實例每篷。
但如果該ActivityA是singleInstance模式的話,那么無論有多少個應(yīng)用程序調(diào)用它端圈,它都只可能在系統(tǒng)中存在一個實例同時該實例還是位于它自己的一個單獨的任務(wù)棧中焦读。
這個經(jīng)常使用于系統(tǒng)中的應(yīng)用,比如Launch舱权、鎖屏鍵的應(yīng)用等等矗晃,整個系統(tǒng)中僅僅有一個!所以在我們的應(yīng)用中一般不會用到宴倍。了解就可以张症。
啟動模式的使用方式
- 在 Manifest.xml中指定Activity啟動模式
例如:
<activity android:name="..activity.MultiportActivity" android:launchMode="singleTask"/>
- 啟動Activity時。在Intent中指定啟動模式去創(chuàng)建Activity
例如:
Intent intent = new Intent();
intent.setClass(context, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
Activity 的 Flags
- Intent.FLAG_ACTIVITY_NEW_TASK
使用一個新的任務(wù)棧來啟動一個Activity啊楚,該flag通常用于在Service中啟動Activity的場景吠冤,因為Service中并不存在有Activity任務(wù)棧所以通常通過這種方式來新啟動一個Activity任務(wù)棧并創(chuàng)建新的Activity實例浑彰。 - Intent.FLAG_ACTIVITY_SINGLE_TOP
與在manifest文件里的launchmode指定"singleTop"作用一樣 - Intent.FLAG_ACTIVITY_CLEAR_TOP
與在manifest文件里的launchmode指定"singleTask"作用一樣 - Intent.FLAG_ACTIVITY_NO_HISTORY
設(shè)置了該Flags的Activity在啟動其他Activity后該Activity就消失了恭理,不會保留在Activity棧中,此Activity可以作為一個中轉(zhuǎn)Activity來負(fù)責(zé)啟動其他的Activity郭变。