Android之a(chǎn)ctivity詳解

image.png

Activity生命周期

image.png
接口函數(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!
image.png

與生命周期相關(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)行指定测柠。


image.png

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)用中一般不會用到宴倍。了解就可以张症。

image.png

啟動模式的使用方式

  1. 在 Manifest.xml中指定Activity啟動模式
    例如:
 <activity android:name="..activity.MultiportActivity" android:launchMode="singleTask"/>
  1. 啟動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

  1. Intent.FLAG_ACTIVITY_NEW_TASK
    使用一個新的任務(wù)棧來啟動一個Activity啊楚,該flag通常用于在Service中啟動Activity的場景吠冤,因為Service中并不存在有Activity任務(wù)棧所以通常通過這種方式來新啟動一個Activity任務(wù)棧并創(chuàng)建新的Activity實例浑彰。
  2. Intent.FLAG_ACTIVITY_SINGLE_TOP
    與在manifest文件里的launchmode指定"singleTop"作用一樣
  3. Intent.FLAG_ACTIVITY_CLEAR_TOP
    與在manifest文件里的launchmode指定"singleTask"作用一樣
  4. Intent.FLAG_ACTIVITY_NO_HISTORY
    設(shè)置了該Flags的Activity在啟動其他Activity后該Activity就消失了恭理,不會保留在Activity棧中,此Activity可以作為一個中轉(zhuǎn)Activity來負(fù)責(zé)啟動其他的Activity郭变。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末颜价,一起剝皮案震驚了整個濱河市涯保,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌周伦,老刑警劉巖夕春,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異专挪,居然都是意外死亡及志,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門寨腔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來速侈,“玉大人,你說我怎么就攤上這事迫卢∫邪幔” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵乾蛤,是天一觀的道長每界。 經(jīng)常有香客問我,道長家卖,這世上最難降的妖魔是什么眨层? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮篡九,結(jié)果婚禮上谐岁,老公的妹妹穿的比我還像新娘。我一直安慰自己榛臼,他們只是感情好伊佃,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著沛善,像睡著了一般航揉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上金刁,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天帅涂,我揣著相機(jī)與錄音,去河邊找鬼尤蛮。 笑死媳友,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的产捞。 我是一名探鬼主播醇锚,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了焊唬?” 一聲冷哼從身側(cè)響起恋昼,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赶促,沒想到半個月后液肌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡鸥滨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年嗦哆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片婿滓。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡吝秕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出空幻,到底是詐尸還是另有隱情烁峭,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布秕铛,位于F島的核電站约郁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏但两。R本人自食惡果不足惜鬓梅,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谨湘。 院中可真熱鬧绽快,春花似錦、人聲如沸紧阔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽擅耽。三九已至活孩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間乖仇,已是汗流浹背憾儒。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留乃沙,地道東北人起趾。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像警儒,于是被迫代替她去往敵國和親训裆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android Activity詳解 Activity是Android系統(tǒng)中的四大組件之一,用于顯示View缭保,與用...
    一個番茄柿閱讀 999評論 0 5
  • 當(dāng)你決定要學(xué)習(xí)android的時候,這時候就需要制定一個學(xué)習(xí)路線蝙茶,而我們應(yīng)該從哪里入手呢艺骂?你可以想象一下,當(dāng)你打開...
    強(qiáng)大帥閱讀 7,830評論 2 10
  • 我們知道Activity的啟動模式有四種分別為:standard(標(biāo)準(zhǔn)模式)隆夯、singleTop(棧頂復(fù)用模式)钳恕、...
    menteelin閱讀 707評論 0 2
  • Activity 生命周期 注意點 Activity切換時,舊Activity的onPause會先執(zhí)行蹄衷,然后才會啟...
    Vinson武閱讀 411評論 0 1
  • 從實習(xí)到現(xiàn)在忧额,工作了也快一年了,期間過程也碰到和解決了不少的問題愧口,我的為知筆記上也積累了許許多多零零散散的知識點睦番。...
    Dracula716閱讀 5,782評論 1 13