關于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