四大組件-----Activity詳解

關于Activity

引用google官方文檔漠烧,是這么說的:

Activity
是一個應用組件,用戶可與其提供的屏幕進行交互靡砌,以執(zhí)行撥打電話已脓、拍攝照片盯桦、發(fā)送電子郵件或查看地圖等操作异袄。 每個 Activity 都會獲得一個用于繪制其用戶界面的窗口。窗口通常會充滿屏幕宙攻,但也可小于屏幕并浮動在其他窗口之上。

Activity是整個應用的基礎堕担,也是最基本的組件已慢,一個應用通常由多個彼此松散聯(lián)系的 Activity 組成。
關于Activity照宝,我們需要了解以下幾部分內容:

1.生命周期

關于生命周期蛇受,涉及的方法主要有下面七個:
onCreate()
首次創(chuàng)建 Activity 時調用。 您應該在此方法中執(zhí)行所有正常的靜態(tài)設置 — 創(chuàng)建視圖厕鹃、將數(shù)據(jù)綁定到列表等等兢仰。 系統(tǒng)向此方法傳遞一個 Bundle 對象,其中包含 Activity 的上一狀態(tài)(前提是捕獲了該狀態(tài))剂碴。始終后接 onStart()把将。
onRestart()
當前Activity已經創(chuàng)建,但是處于后臺不可見狀態(tài)(onStop已經執(zhí)行)忆矛,再次啟動時調用察蹲。始終后接 onStart()。
與其他方法不同的是催训,onRestart()在整個生命周期中不是必定執(zhí)行的方法洽议。
onStart()
在 Activity 即將對用戶可見之前調用。
如果 Activity 轉入前臺漫拭,則后接 onResume()亚兄,如果 Activity 轉入隱藏狀態(tài),則后接 onStop()
onResume()
在 Activity 即將開始與用戶進行交互之前調用采驻。 此時审胚,Activity 處于 Activity 堆棧的頂層,并具有用戶輸入焦點礼旅。
始終后接 onPause()膳叨。
onPause()
當系統(tǒng)即將開始繼續(xù)另一個 Activity 時調用。 此方法通常用于確認對持久性數(shù)據(jù)的未保存更改痘系、停止動畫以及其他可能消耗 CPU 的內容菲嘴,諸如此類。 它應該非常迅速地執(zhí)行所需操作汰翠,因為它返回后临谱,下一個 Activity 才能繼續(xù)執(zhí)行。
如果 Activity 返回前臺奴璃,則后接 onResume(),如果 Activity 轉入對用戶不可見狀態(tài)城豁,則后接 onStop()苟穆。
onStop()
在 Activity 徹底對用戶不可見的時候調用。
如果 Activity 恢復與用戶的交互,則后接 onRestart()雳旅,如果 Activity 被銷毀跟磨,則后接 onDestroy()。
onDestroy()
在 Activity 被銷毀前調用攒盈。這是 Activity 將收到的最后調用抵拘。 當 Activity 結束(有人對 Activity 調用了 finish()
),或系統(tǒng)為節(jié)省空間而暫時銷毀該 Activity 實例時型豁,可能會調用它僵蛛。 您可以通過isFinishing() 方法區(qū)分這兩種情形。

因此迎变,按照Activity的狀態(tài)充尉,生命周期分為三個部分,完整周期(onCreate到onDestroy)衣形,可見周期(onStart到onStop)驼侠,前臺周期(onResume到onPause)。系統(tǒng)會根據(jù)Activity所處的狀態(tài)來決定調用的方法谆吴。

2.保存Activity狀態(tài)

當 Activity 暫偷乖矗或停止時,Activity 的狀態(tài)會得到保留句狼,是如何操作的呢笋熬?主要用到這個方法:
onSaveInstanceState()
那么,什么時候會調用該方法鲜锚?簡言之突诬,在Activity即將處于可能被銷毀的狀態(tài)時(非用戶主動銷毀,比如按下back鍵)芜繁。按下home鍵旺隙,電源鍵,啟動新的Activity以及橫豎屏切換等骏令。
該方法調用一定在onStop之前蔬捷,可能在onPause之前。
調用該方法的時候榔袋,系統(tǒng)會向此方法傳遞一個Bundle周拐,用來保存重要的數(shù)據(jù),以便重建的時候恢復狀態(tài)凰兑。在重建Activity時妥粟,該Bundle會傳遞給onCreate和onRestoreInstanceState,可以在這兩個方法中恢復狀態(tài)吏够。
onRestoreInstanceState()
該方法調用時處于Create和Start之后勾给,除非Activity確實被銷毀了滩报,重建時才會調用該方法,否則不會調用播急。
另外脓钾,橫豎屏切換的時候有些特殊,默認情況下桩警,橫豎屏切換時可训,當前Activity會銷毀然后重建。
也就是說捶枢,執(zhí)行順序會是這樣子:
Pause→SaveInstanceState→Stop→Destroy→Create→Start→RestoreInstanceState→Resume

這里會涉及一個configuration的概念握截。在manifest文件里可以配置Activity的屬性:
android:configChanges="orientation|screenSize"
此時切換橫豎屏,Activity不會銷毀柱蟀,只會調用onConfigurationChanged方法川蒙。

3.任務和返回棧

應用通常包含多個Activity,當一個Activity被啟動時长已,如果當前不存在任務畜眨,系統(tǒng)會創(chuàng)建新的任務,并將該Activity作為根Activity存在返回棧中术瓮,新的Activity啟動時康聂,會放在該Activity之上,處于棧頂位置胞四,棧頂?shù)腁ctivity作為用戶焦點恬汁。當back鍵按下時,棧頂?shù)腁ctivity被銷毀出棧辜伟,下一個Activity推到棧頂位置氓侧。
應當注意的是,每個Activity會有一個taskAffinity屬性导狡,默認情況下约巷,一個應用中所有的Activity都具有相同的taskAffinity,也就是說旱捧,所有Activity會被存放在同一個任務中独郎,哪怕當前應用調用了其他應用的Activity。
如果想將Activity存放到新的任務中枚赡,采用以下步驟:
1.給intent添加一個NEW_TASK的flag
2.manifest中指定Activity的taskAffinity(通常值為某應用的包名)

除此之外氓癌,Activity還有一個allowTaskReparenting的屬性。從字面可以這么理解贫橙,允許重新分配父任務贪婉。當設置它為true的時候,會出現(xiàn)這種情況:
A應用啟動了B應用的一個Activity1卢肃,此時Activity1會處于A應用的任務棧中疲迂,這時候啟動B應用星压,奇怪的事情發(fā)生了,B應用出現(xiàn)的不是啟動界面鬼譬,而是Activity1。因為逊脯,B應用創(chuàng)建了自己的任務棧之后优质,會將Activity1從A的棧中轉移過來,所以顯示的是Activity1军洼。

4.啟動模式

四種啟動模式相信大家都耳熟能詳了:
standard(默認模式)
Activity啟動一次巩螃,就會生成一個新的實例,并添加到返回棧的頂部匕争。
singleTop
如果當前棧頂位置已經有該Activity的實例避乏,那么,系統(tǒng)只會調用onNewIntent方法甘桑,向其傳送intent拍皮,不會生成新的實例。
如果當前棧頂位置不是該Activity跑杭,那么铆帽,不管該棧中是夠有該Activity的其他實例,都會在棧頂生成新的Activity德谅。
singleTask
任務棧中只允許有一個該Activity的實例爹橱。如果沒有,生成一個窄做,如果已有該Activity的實例愧驱,將該實例之上的Activity出棧,系統(tǒng)只會調用onNewIntent方法椭盏,向其傳送intent组砚,不會生成新的實例。
singleInstance
生成該Activity的實例庸汗,并將其放入單獨的返回棧中惫确,該棧中不允許存放其他的Activity。
如果之前已經生成該Activity的實例蚯舱。那么改化,系統(tǒng)只會調用onNewIntent方法,向其傳送intent枉昏,不會生成新的實例陈肛。
注意:除了standard模式,其他三個都存在調用onNewIntent的情況兄裂。

5.啟動Activity以及參數(shù)傳遞

startActivity句旱,通過intent傳遞參數(shù)就不多說了阳藻。詳細說一下startActivityForResult:
此方法用在希望從啟動的Activity獲取返回結果的情況下。
相關方法:
startActivityForResult(Intent intent, Int requestCode)
setResut(int resultCode, Intent intent)
onActivityResult(int requestCode, int resultCode, Intent intent)

Activity A啟動Activity B谈撒,并希望傳回結果時腥泥,操作方法如下:

A用startActivityForResult來啟動B,requestCode用來判斷傳回的結果(取值>=0)啃匿。因為一個Activity中可能有許多onActivityResult蛔外,所以必須設置requestCode用來識別傳回的結果是來自哪一個Activity

B中用setResult來填入希望返回的值,resultCode設置為RESULT_OK溯乒,Intent用來攜帶傳回的值

A中重寫回調方法onActivityResult 根據(jù)requestCode來獲取想要的結果夹厌。

值得一提的是,setResult應該在什么時候調用呢裆悄?
因為Activity被finish的時候才會把結果傳回去矛纹,所以,setResult應該在被Activity被finish之前調用光稼。

其他

Activity的屬性及其意義或南,點擊這里.
常用方法:
onBackPressed:按下back鍵時調用的方法
finish():銷毀Activity

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市钟哥,隨后出現(xiàn)的幾起案子迎献,更是在濱河造成了極大的恐慌,老刑警劉巖腻贰,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吁恍,死亡現(xiàn)場離奇詭異,居然都是意外死亡播演,警方通過查閱死者的電腦和手機冀瓦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來写烤,“玉大人翼闽,你說我怎么就攤上這事≈薮叮” “怎么了感局?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長暂衡。 經常有香客問我询微,道長,這世上最難降的妖魔是什么狂巢? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任撑毛,我火速辦了婚禮,結果婚禮上唧领,老公的妹妹穿的比我還像新娘藻雌。我一直安慰自己雌续,他們只是感情好,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布胯杭。 她就那樣靜靜地躺著驯杜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪做个。 梳的紋絲不亂的頭發(fā)上艇肴,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音叁温,去河邊找鬼。 笑死核畴,一個胖子當著我的面吹牛膝但,可吹牛的內容都是我干的。 我是一名探鬼主播谤草,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼跟束,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了丑孩?” 一聲冷哼從身側響起冀宴,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎温学,沒想到半個月后略贮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡仗岖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年逃延,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轧拄。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡揽祥,死狀恐怖,靈堂內的尸體忽然破棺而出檩电,到底是詐尸還是另有隱情拄丰,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布俐末,位于F島的核電站料按,受9級特大地震影響,放射性物質發(fā)生泄漏鹅搪。R本人自食惡果不足惜站绪,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望丽柿。 院中可真熱鬧恢准,春花似錦魂挂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至敏沉,卻和暖如春果正,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盟迟。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工秋泳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人攒菠。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓迫皱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辖众。 傳聞我的和親對象是個殘疾皇子卓起,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內容

  • Activity 是一個應用組件,用戶可與其提供的屏幕進行交互凹炸,以執(zhí)行撥打電話戏阅、拍攝照片、發(fā)送電子郵件或查看地圖等...
    岳小川閱讀 480評論 0 3
  • 關于為什么要寫屬于自己的博客啤它,我在前一篇文章中也提到了奕筐。主要是歸納自己這一個時期所學到的知識,幫助自己更好的理解变骡,...
    Kevin_Jern閱讀 880評論 0 9
  • 本文主要搜集記錄一下Android開發(fā)的四大組件:一救欧、Activity詳解二、Service詳解三锣光、Broadca...
    AFinalStone閱讀 591評論 0 2
  • [文章內容來自Developers]應用通常包含多個 Activity笆怠。每個 Activity 均應圍繞用戶可以執(zhí)...
    岳小川閱讀 690評論 0 4
  • 小的時候一塊錢便是一筆巨款蹬刷,我是個斂財奴,喜歡把七零八落的硬幣聚起來频丘,藏在我的百寶盆里办成。 班上的女老師每天販賣...
    盲盲之書閱讀 382評論 0 1