各個(gè)生命周期
- onCreate()
創(chuàng)建activity時(shí)調(diào)用递鹉, 在此方法中做一些findView, 變量的初始化,intent的解析等垢村。 - onStart()
界面可見狀態(tài)時(shí)回調(diào)。 - onResume()
獲取到了焦點(diǎn)時(shí)嚎卫,回調(diào) - onPause()
失去焦點(diǎn)時(shí)回調(diào)嘉栓。不宜做太多邏輯處理, 避免影響要啟動(dòng)的activity的時(shí)間 - onStop()
不可見時(shí)回調(diào) - onDestroy()
銷毀activity時(shí)回調(diào) - onRestart()
當(dāng)該activity處于onStop狀態(tài)拓诸,然后又被操作 讓其轉(zhuǎn)變?yōu)榭梢姞顟B(tài)侵佃,即由完全不可諫狀態(tài)轉(zhuǎn)變?yōu)榭梢姞顟B(tài)時(shí), 會(huì)先執(zhí)行onRestart()方法奠支,再執(zhí)行onStart()馋辈。 注意:即使在onRestart()方法中調(diào)用finish()方法, 還是會(huì)在隨后調(diào)用onStart()方法
狀態(tài)的保存與恢復(fù)
- onSaveInstanceState(Bundle outState)
此方法會(huì)在切換 狀態(tài)時(shí)倍谜,而要切換后的狀態(tài)很可能被動(dòng)的回收掉時(shí)迈螟,為了恢復(fù)時(shí)能重現(xiàn)之前的現(xiàn)場(chǎng),做的一些狀態(tài)保存操作尔崔。注意activity中的布局view設(shè)置了id的才會(huì)保存和恢復(fù)答毫。沒有設(shè)置id,無法恢復(fù)
此方法一定在onStop方法前調(diào)用季春, 但和onPause方法的前后順序不確定 - onRestoreInstacneState(Bundle savedInstanceState)
在此方法中做恢復(fù)狀態(tài)洗搂。恢復(fù)狀態(tài)的邏輯也可以寫在onCreate方法中载弄, 但在onCreate方法中做恢復(fù)狀態(tài)耘拇,要判斷參數(shù) 是否為空, 不為空 表示之前有保存狀態(tài)宇攻。
而在onRestoreInstanceState方法中不需要判斷參數(shù)!= null驼鞭。
一些比較有用的方法
- onPostCreate(Bundle savedInstanceState)
此方法在activity徹底跑起來后調(diào)用, 因此可以用來獲取view的寬高尺碰。等一些時(shí)機(jī)敏感的操作挣棕。不過此方法一般不建議重寫译隘。此方法是在onResume前調(diào)用的。
onActivityResult
當(dāng)調(diào)用startActivityForResult(intent, requestCode)方法啟動(dòng)另一個(gè)Activity時(shí)洛心, 另一個(gè)Activity返回到此activity會(huì)攜帶一個(gè)Intent固耘,以及requestCode, resultCode
onActivityResult(int requestCode, int resultCode, Intent data)
setResult
setResult(int resultCode, Intent intent) || setResult(int resultCode)词身。 設(shè)置返回結(jié)果和數(shù)據(jù)厅目, 后一個(gè)返回值 數(shù)據(jù)為null
隱式啟動(dòng)注意事項(xiàng)
必須有action,必須有設(shè)置<category android:name="android.intent.category.DEFAULT"/>
因?yàn)閟tartActivity會(huì)默認(rèn)設(shè)置category為default法严。
匹配activity的規(guī)則是损敷,滿足Activity的設(shè)置的任意一條intent-filter。何謂滿足了該intent-filter深啤?就是下面的規(guī)則:該intent-filter里拗馒,其中多個(gè)action和多個(gè)data滿足一個(gè)就行,category必須全部滿足溯街。
4種啟動(dòng)模式
- standard
標(biāo)準(zhǔn)啟動(dòng)模式诱桂, 每一次啟動(dòng)都在任務(wù)棧中新生成一個(gè)Activity實(shí)例置于棧頂 - singleTop
如果任務(wù)棧頂就是要啟動(dòng)的Activity同類實(shí)例。則不生成新實(shí)例呈昔,而是調(diào)用棧頂?shù)腁ctivity的onNewIntent()方法 - singleTask
一個(gè)任務(wù)棧中已經(jīng)存在要啟動(dòng)的Activity的實(shí)例時(shí)挥等, 會(huì)將其上的activity全部finish掉, 然后調(diào)用onNewIntent()方法 - singleInstance
如果系統(tǒng)中已經(jīng)存在一個(gè)擁有該Activity實(shí)例的任務(wù)棧堤尾, 則直接調(diào)用該實(shí)例的onNewIntent方法肝劲。 否則,會(huì)單獨(dú)新開一個(gè)任務(wù)棧郭宝, 生成該Activity的實(shí)例辞槐。
值得注意的坑
當(dāng)要啟動(dòng)的activity的launchMode為singleTask或者singleInstance時(shí),如果是使用startActivityForResult啟動(dòng)剩蟀,則會(huì)立馬執(zhí)行onActivityResult方法,且收到一個(gè) RESULT_CANCEL的resultCode切威。背后的原理是兩個(gè)activity不在同一個(gè)任務(wù)棧中導(dǎo)致育特。 因此需要采用廣播 或者發(fā)送事件的方式代替此方法!
onConfigurationChanged
尤其要注意屏幕旋轉(zhuǎn)問題時(shí)的處理先朦。