安卓整體梳理一(生命週期和啓動模式)

生命週期和啓動模式是安卓最最基礎的部分,這裏簡單梳理下並做記錄,

Activity生命週期

典型情況下指的是再用戶的正常使用過程中,activity的生命週期變化,而異常情況指的是activity因爲內存等因素被系統回收,或者因爲設備的configuration發生變化(如橫豎屏切換)導致activity被銷燬重建。

一、典型情況的生命週期

針對上圖的經典生命週期,這裏有幾點特別說明:

  • 當用戶跳轉新的activity,短暫離開當前activity,當前activity回調  onPause--onStop 退至後臺
  • 當用戶緊接着返回來時,當前activity回調 onRestart--onStart--onResume回到前臺
  • onStart、onStop是回調錶示activity是否可見,onResume、onPause回調錶示activity是否位於前臺
  • A跳轉 B,生命週期順序是 onPause(A)--onCreate(B)--onStart(B)--onResume(B)--onStop(A),這也就是爲什麼onPause不能做耗時操作,他是影響後面新頁面的展示的,耗時操作會造成頁面切換的卡頓。

二、異常情況的生命週期

針對上圖的意外情況下生命週期,有幾點說明:

  • Activity被銷燬後,onPause、onStop、onDestroy會被依次調用,onSaveInstanceState調用在onStop之前
  • Activity被重建後,系統會在onStart之後回調onRestoreInstanceState,接收到onSaveInstanceState保存的Bundel對象,另外onCreate也能接收到這個對象,但是需要判空,而onRestoreInstanceState一旦被調用,就表面一定是發生了意外情況,所以他的Bundle必然不是空的
  • 在內存資源不足的導致低優先級的Activity被殺死(優先級排序  前臺Activity(與用戶交互)>可見但並非前臺(被對話框擋住的Activity)>後臺Activity(比如執行了onStop的))
  • 針對手機配置變化導致的Activity銷燬重建,可以在menifest文件配置acitiviy的 configconges屬性,常用的有 locale、orientation、keyboardHidden三個,制定這些屬性後,再發生這樣的配置變化的時候,Activity不會銷燬重建,onSaveInstanceState和onRestoreInstanceState也不會調用,取而代之的是Activity的onConfigrationChanged方法。

Activity的啓動模式:

四種模式:

這裏先說明一下Activity的任務棧,默認情況下,Activity所需的任務棧名字是應用的包名,當然我們也可以爲每個Activiy指定任務棧(通過menefest文件爲Activity添加taskAffinity屬性指定一個不同的棧名,一般只是針對singleTask模式)

  1. standard:標準模式,也是系統的默認模式,每次啓動都會在啓動Activity的棧中創建一個新的實例
  2. singleTop:棧頂複用,如果目標Activity已經處在棧頂,那麼不會被重新創建只會調用onNewIntent,
  3. singleTask:棧內複用,singleTask是可以指定taskAffinity指定所需棧的,在啓動的時候就會先判斷是否存在所需棧(沒有指定的話就是包名棧),如果存在所需棧,進一步判斷棧裏是否有已存在實例,如果存在,就會以clearTop的方式升至棧頂並調用onNewIntent,如果沒找到實例就創建一個新的實例,而如果不存在所需的棧,就創建一個所需棧,然後創建一個新的實例壓入棧中
  4. singleInstace:單實例,這是一種加強的singleTask,他除了具有singleTask的所有特性,還加強了一點,就是具有這種模式的Activiy都只能單獨的位於一個棧中,也就是首次創建的時候,會爲他創建一個新的任務棧然後創建一個新的實例,且由於棧內複用的特性,之後的請求都不用再創建新的Activiy了,除非這個任務棧被銷燬

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章