Activity的使用

各個(gè)生命周期

  • onCreate()
    創(chuàng)建activity時(shí)調(diào)用, 在此方法中做一些findView, 變量的初始化,intent的解析等。
  • onStart()
    界面可見(jiàn)狀態(tài)時(shí)回調(diào)。
  • onResume()
    獲取到了焦點(diǎn)時(shí),回調(diào)
  • onPause()
    失去焦點(diǎn)時(shí)回調(diào)。不宜做太多邏輯處理, 避免影響要啟動(dòng)的activity的時(shí)間
  • onStop()
    不可見(jiàn)時(shí)回調(diào)
  • onDestroy()
    銷毀activity時(shí)回調(diào)
  • onRestart()
    當(dāng)該activity處于onStop狀態(tài),然后又被操作 讓其轉(zhuǎn)變?yōu)榭梢?jiàn)狀態(tài),即由完全不可諫狀態(tài)轉(zhuǎn)變?yōu)榭梢?jiàn)狀態(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ù)。沒(méi)有設(shè)置id,無(wú)法恢復(fù)
    此方法一定在onStop方法前調(diào)用, 但和onPause方法的前后順序不確定
  • onRestoreInstacneState(Bundle savedInstanceState)
    在此方法中做恢復(fù)狀態(tài)?;謴?fù)狀態(tài)的邏輯也可以寫(xiě)在onCreate方法中, 但在onCreate方法中做恢復(fù)狀態(tài),要判斷參數(shù) 是否為空, 不為空 表示之前有保存狀態(tài)。
    而在onRestoreInstanceState方法中不需要判斷參數(shù)!= null。

一些比較有用的方法

  • onPostCreate(Bundle savedInstanceState)
    此方法在activity徹底跑起來(lái)后調(diào)用, 因此可以用來(lái)獲取view的寬高。等一些時(shí)機(jī)敏感的操作。不過(guò)此方法一般不建議重寫(xiě)。此方法是在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ú)新開(kāi)一個(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)問(wèn)題時(shí)的處理。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容