activity(1)生命周期

一、官方生命周期圖

Activity Lifecycle

首先會介紹 onCreate(),啟動Activity的第一個方法,主要是初始化資料,以及指定畫面資源 setContentView() 呈現(xiàn)目前的 Layout.xml,和包含一些需要初始化的組件。

接著 OnStart(),適合執(zhí)行畫面組件的內容。比方說當 Activity 沉到背景后,如果把設定的內容放在 onCreate(),當喚醒后會跳過 onCreate(),直接執(zhí)行 OnStart()。比如記憶賬號、密碼 EditText。

onResume(),如對 Button 或 EditText 做點擊的動作,此時會獲得焦點,進行我們設計好的動作,比如輸入或確認的動作,簡單來說是 Activity 與使用者互動。

onPause() : 組件暫停,暫停執(zhí)行中的工作和線程。onPause() 執(zhí)行完后,通常會馬上再執(zhí)行 onStop()部分,但有例外,如果是碰到Dialog,沒有完全遮蓋住屏幕,那么便會在 onPause()停止,操作完 Dialog后,再按照原本的生命周期來運行。

onStop() : 停止,停止執(zhí)行中的工作和線程,畫面完全消失,但Activity還留在后臺。

onDestory() : 銷毀Activity,清除所有建立的資源,生命周期結束,包含GC回收動作。

如果說到這邊面試官沒有打斷,甚至示意讓繼續(xù)說下去,那么我會告訴他幾個個常見的動作。

點選主畫面按鈕
onPause() > onStop()
開啟相機或另一個 Activity 或進入待命狀態(tài)
onPause() > onStop(),當 Activity 結束或屏幕結束待命 onRestart() > onStart() > onResume()
Dialog執(zhí)行
onResume() > onPause(),操作完后執(zhí)行onResume()

*在畫面轉向時,生命周期會重新執(zhí)行。我猜面試官如果沒有當下問這個問題,我不會說死,當他之后再問也可以比較從容地回答這個問題。

補充 :

onCreate只能執(zhí)行一次,onStart()能執(zhí)行多次
onStop() 中 Activty 還沒有被銷毀,還存在內存中,可以透過切換Activity回復。onDestory() 是已經(jīng)摧毀。
不要再 onStart()執(zhí)行,判斷屏幕方向代碼,否則會有無限循環(huán)問題。

二、 Launch Mode

2.1> 啟動模式
Launch Mode都不會陌生,用于設定Activity的啟動方式,無論是哪種啟動方式,所啟動的Activity都會位于Activity棧的棧頂。有以下四種:

  • standerd:默認模式,每次啟動Activity都會創(chuàng)建一個新的Activity實例。
  • singleTop:如果要啟動的Activity已經(jīng)在棧頂,則不會重新創(chuàng)建Activity,同時該Activity的onNewIntent方法會被調用。如果要啟動的Activity不在棧頂,則會重新創(chuàng)建該Activity的實例。
  • singleTask:如果要啟動的Activity已經(jīng)存在于它想要歸屬的棧中,那么不會創(chuàng)建該Activity實例,將棧中位于該Activity上的所有的Activity出棧,同時該Activity的onNewIntent方法會被調用。如果要啟動的Activity不存在于它想要歸屬的棧中,并且該棧存在,則會重新創(chuàng)建該Activity的實例。如果要啟動的Activity想要歸屬的棧不存在,則首先要創(chuàng)建一個新棧,然后創(chuàng)建該Activity實例并壓入到新棧中。
  • singleInstance:和singleTask基本類似,不同的是啟動Activity時,首先要創(chuàng)建在一個新棧,然后創(chuàng)建該Activity實例并壓入新棧中,新棧中只會存在這一個Activity實例。

2.2> Intent的FLAG

Intent中定義了很多了FLAG,其中有幾個FLAG也可以設定Activity的啟動方式,如果Launch Mode設定和FLAG設定的Activity的啟動方式有沖突,則以FLAG設定的為準。

  • FLAG_ACTIVITY_SINGLE_TOP:和Launch Mode中的singleTop效果是一樣的。
  • FLAG_ACTIVITY_NEW_TASK:和Launch Mode中的singleTask效果是一樣的。
  • FLAG_ACTIVITY_CLEAR_TOP:Launch Mode中沒有與此對應的模式,如果要啟動的Activity已經(jīng)存在于棧中,則將所有位于它上面的Activity出棧。singleTask默認具有此標記位的效果。

除了這三個FLAG,還有一些FLAG對我們分析棧管理有些幫助。

  • FLAG_ACTIVITY_NO_HISTORY:Activity一旦退出,就不會存在于棧中。同樣的,也可以在AndroidManifest.xml中設置“android:noHistory”。
  • FLAG_ACTIVITY_MULTIPLE_TASK:需要和FLAG_ACTIVITY_NEW_TASK一同使用才有效果,系統(tǒng)會啟動一個新的棧來容納新啟動的Activity.
  • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:Activity不會被放入到“最近啟動的Activity”列表中。
  • FLAG_ACTIVITY_BROUGHT_TO_FRONT:這個標志位通常不是由應用程序中的代碼設置的,而是Launch Mode為singleTask時,由系統(tǒng)自動加上的。
  • FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY:這個標志位通常不是由應用程序中的代碼設置的,而是從歷史記錄中啟動的(長按Home鍵調出)。
  • FLAG_ACTIVITY_CLEAR_TASK:需要和FLAG_ACTIVITY_NEW_TASK一同使用才有效果,用于清除與啟動的Activity相關棧的所有其他Activity。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容