Activity詳解(一)

Activity是Android組件中最基本也是最為常見用的四大組件(Activity矮烹,Service图焰,Content Provider盐碱,BroadcastReceiver)之一;
本篇主要從以下幾點(diǎn)來詳解Activity
*Activity的生命周期
*Activity的啟動模式

一榛了、Activity的生命周期

0_1314838777He6C.png

可以看到Activity有7個(gè)最基本的生命周期方法
1.onCreate:Activity即將被創(chuàng)建矿咕;

2.onStart:表示Activity正在被啟動抢肛,已經(jīng)可見了,但是還沒有顯示到前臺碳柱;

3.onRestart:Activity正在重新啟動捡絮,當(dāng)Activity從不可見到可見時(shí)會調(diào)用此方法;

4.onResume:Activity可見莲镣,并且已經(jīng)顯示到前臺可以和用戶交互了福稳;(onStart的時(shí)候Activity還在后臺,在onResume后Activity才顯示到前臺)

5.onPause:Activity正在停止(可見但不在前臺)瑞侮;

6.onStop:Activity即將停止(不可見亦不在前臺)的圆;

7.onDestroy:Activity即將銷毀鼓拧;

接下來我們從幾個(gè)實(shí)例中來具體了解一下Activity的生命周期;

首先:我們正常啟動一個(gè)Activity


Paste_Image.png

然后我們回到桌面:


Paste_Image.png

我們再次打開這個(gè)Activity
Paste_Image.png

在這個(gè)Activity上再啟動一個(gè)Dialog形式的Activity越妈,第一個(gè)Activity任然可見季俩,但是已經(jīng)轉(zhuǎn)入后臺


Paste_Image.png

然后我們退出Dialog返回第一個(gè)Activity
Paste_Image.png

從第一個(gè)Activity跳轉(zhuǎn)到另一個(gè)Activity(非Dialog形式)
Paste_Image.png

再推出第二個(gè)Activity返回第一個(gè)
Paste_Image.png

最后我們退出第一個(gè)Activity
Paste_Image.png

這里有幾點(diǎn)需要注意:
1、onCreate和onDestroy梅掠、onStart和onStop酌住、onResume和onPause是配對的,其中
onPause和onResume與onStart和onStop的區(qū)別在于前者是以是否在前臺顯示來判斷的后者是以是否可以見來區(qū)分的阎抒;

2酪我、從一個(gè)Activity啟動另一個(gè)Activity,第一個(gè)Activity會首先onPause且叁,緊接著第二個(gè)Activity開始o(jì)nCreate祭示、onStart、onResume后谴古,第一個(gè)Activity執(zhí)行onStop;一定要注意跳轉(zhuǎn)時(shí)候Activity的生命周期方法執(zhí)行順序稠歉;

特別說明:如果在一個(gè)Activity上啟動了一個(gè)Dialog(非Activity形式)掰担,這時(shí)候Activity雖然可見,但是不在前臺怒炸,Activity是不會執(zhí)行onPause方法的带饱;

下面我們來研究一下異常情況下Activity的生命周期,所謂異常情況就是資源相關(guān)的系統(tǒng)配置發(fā)生改變導(dǎo)致Activity被殺死并重建或者資源內(nèi)存不足導(dǎo)致優(yōu)先級低的Activity被系統(tǒng)回收等等阅羹;最常見的就是橫豎屏切換勺疼,Activity狀態(tài)會發(fā)生那些改變呢;

首先我們正常啟動一個(gè)Activity:


Paste_Image.png

正常的走了生命周期的方法幔荒;

然后我們從豎屏切換到橫屏:


Paste_Image.png

這里我們可以看到待逞,Activity銷毀了并重新創(chuàng)建榴啸,Activity在銷毀之前調(diào)用了onSaveInstanceState,并且在Activity重新創(chuàng)建成功后調(diào)用了onRestoreInstanceState方法轨淌;
onSaveInstanceState:Activity異常銷毀保存Activity數(shù)據(jù)和狀態(tài);
onRestoreInstanceState:Activity異常銷毀重新創(chuàng)建后恢復(fù)數(shù)據(jù)看尼;
注意:以上方法只會在Activity異常銷毀的時(shí)候調(diào)用递鹉,正常情況下是不會調(diào)用的;

另外還有一種特殊情況藏斩,我們在某些狀態(tài)改變導(dǎo)致Activity銷毀重建如果不希望Activity重新創(chuàng)建躏结,例如橫豎屏切換不希望Activity重新創(chuàng)建需要在清單文件中Activity中配置 android:configChanges="orientation" (需要minSdkVersion和targetSdkVersion的值都小于13否則需要配置android:configChanges="orientation|screenSize")
我們來看一下效果,添加以上配置后狰域,我們將Activity從豎屏切換到橫屏


Paste_Image.png

可以看到Activity并沒有重建媳拴,而是調(diào)用了onConfigurationChanged方法黄橘;

通過上面的分析,我們已經(jīng)了解了Activity的生命周期禀挫,以及Activity在特殊情況下的生命周期旬陡;掌握了Activity的生命周期,就可以在不同的方法中做相應(yīng)的處理语婴,對以后的開發(fā)很有幫助描孟;

二、Activity的啟動模式

①standard:標(biāo)準(zhǔn)模式砰左,系統(tǒng)默認(rèn)模式匿醒,最常用;

②singleTop:棧頂復(fù)用模式缠导,如果Activity位于任務(wù)棧內(nèi)棧頂位置Activity不會重新創(chuàng)建廉羔;

③singleTask:棧內(nèi)復(fù)用模式,只要Activity在棧內(nèi)存在僻造,多次啟動Activity就不會重新創(chuàng)建憋他;

④singleInstance:單實(shí)例模式;這種模式下髓削,Activity只能單純的存在一個(gè)任務(wù)棧中竹挡;

注意:任務(wù)棧是一種“后進(jìn)先出”棧結(jié)構(gòu),每一個(gè)Activity都必須依賴一個(gè)任務(wù)棧立膛,這也是為什么我們用ApplicationContext去啟動Activity的時(shí)候會報(bào)錯(cuò)的原因揪罕;standard模式下的Activity默認(rèn)會進(jìn)入啟動它的Activity的任務(wù)棧中;非Activity類型的Context(ApplicationContext)并沒有所謂的任務(wù)棧宝泵,所以就出問題了好啰,解決這個(gè)問題就需要為待啟動的Activity指定 FLAG_ACTIVITY_NEW_TASK 標(biāo)記位,這樣就會在啟動的時(shí)候?yàn)槠鋭?chuàng)建一個(gè)新的標(biāo)記位儿奶;

啟動模式解讀:
1框往、standard標(biāo)準(zhǔn)模式:每啟動一次Activity,都會為這個(gè)Activity創(chuàng)建實(shí)例闯捎;

2搅窿、singleTop模式:假如在一個(gè)任務(wù)棧中有ABC三個(gè)Activity(都是singleTop啟動模式),如果再次啟動C隙券,由于C在棧頂男应,那么C就不會被重新創(chuàng)建同時(shí)它的onNewIntent方法會被回調(diào);如果啟動A娱仔,由于A不在棧頂沐飘,A就會被重新創(chuàng)建;

3、singleTask模式:假如一個(gè)任務(wù)棧中有ABC三個(gè)Activity耐朴,(A為singleTask模式)借卧,A并不在棧頂,我們重新啟動A筛峭,A也并不會創(chuàng)建新的铐刘,而是直接移到棧頂并調(diào)用A的onNewIntent方法;此時(shí)棧內(nèi)的Activity為 A 影晓,因?yàn)閟ingleTask模式自帶clearTop的效果镰吵,會導(dǎo)致所有在A上面的Activity自動出棧;

4挂签、singleInstance模式:這個(gè)是加強(qiáng)版的singleTask模式疤祭,它具有singleTask的所有特性;并且還加強(qiáng)了一點(diǎn)饵婆,這種模式下的Activity只能單獨(dú)的位于一個(gè)任務(wù)棧中勺馆,加入A為這種啟動模式,啟動A后侨核,A單獨(dú)位于一個(gè)任務(wù)棧中草穆,這個(gè)任務(wù)棧中只能有一個(gè)Activity A;

注意:由于Activity啟動必須依賴任務(wù)棧搓译,任務(wù)棧是可以指定的悲柱,可以在清單文件中配置android:taskAffinity=“”熟悉,任務(wù)棧的名字為String侥衬,如果不指定,進(jìn)入默認(rèn)的任務(wù)棧跑芳,即以包名為名的任務(wù)棧轴总;

如何給Activity指定啟動模式

第一種方式:直接在AndroidMenifest中指定 android:launchMode

第二種方式:通過Intent中設(shè)置標(biāo)志位來為Activity指定
Intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

兩種方式的區(qū)別:第二種優(yōu)先級大于第一種,如果兩種方式都用了博个,以第二種方式執(zhí)行怀樟;第二種方式無法為Activity指定為singleInstance模式;

Activity中的標(biāo)志位:
1盆佣、FLAG_ACTIVITY_NEW_TASE:為Activity指定singleTask啟動模式

2往堡、FLAG_ACTIVITY_SINGLE_TOP:singleTop模式

3、FLAG_ACTIVITY_CLEAR_TOP:當(dāng)這個(gè)Activity啟動時(shí)所用位于它之上的Activity全部出棧共耍;

4虑灰、FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有這個(gè)標(biāo)記的Activity,不會出現(xiàn)在歷史Activity列表中痹兜;某種情況下穆咐,我們不希望用戶通過歷史列表回到我們的Activity時(shí)這個(gè)標(biāo)記比較有用;等同于在XML中指定Activity的屬性
android:excludeFromRecents="true"

小結(jié):本次的Activity詳解一共就這些內(nèi)容主要點(diǎn)為

1、Activity的生命周期对湃,Activity從啟動到銷毀崖叫,從前臺到后臺,不同情況下Activity的哪些生命周期方法會被調(diào)用拍柒;以及Activity在異常銷毀后重新創(chuàng)建要調(diào)用的方法心傀;

2、Activity的啟動模式拆讯;不同的場景應(yīng)用不同的啟動模式脂男,各個(gè)啟動模式間的區(qū)別;了解這些對以后的開發(fā)很有幫助往果;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末疆液,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子陕贮,更是在濱河造成了極大的恐慌堕油,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肮之,死亡現(xiàn)場離奇詭異掉缺,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)戈擒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門眶明,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人筐高,你說我怎么就攤上這事搜囱。” “怎么了柑土?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵蜀肘,是天一觀的道長。 經(jīng)常有香客問我稽屏,道長扮宠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任狐榔,我火速辦了婚禮坛增,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘薄腻。我一直安慰自己收捣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布庵楷。 她就那樣靜靜地躺著坏晦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上昆婿,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天球碉,我揣著相機(jī)與錄音,去河邊找鬼仓蛆。 笑死睁冬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的看疙。 我是一名探鬼主播豆拨,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼能庆!你這毒婦竟也來了施禾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤搁胆,失蹤者是張志新(化名)和其女友劉穎弥搞,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渠旁,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡攀例,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了顾腊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粤铭。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖杂靶,靈堂內(nèi)的尸體忽然破棺而出梆惯,到底是詐尸還是另有隱情,我是刑警寧澤吗垮,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布垛吗,位于F島的核電站,受9級特大地震影響抱既,放射性物質(zhì)發(fā)生泄漏职烧。R本人自食惡果不足惜扁誓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一防泵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蝗敢,春花似錦捷泞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春咏瑟,著一層夾襖步出監(jiān)牢的瞬間拂到,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工码泞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留兄旬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓余寥,卻偏偏與公主長得像领铐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子宋舷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

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