Android群英傳知識點回顧——第八章:Activity與Activity調用棧分析

來源:互聯網
上載者:User

標籤:命令   restart   3.2   快速   ons   方法   clear   lag   rest   

  • 8.1 Activity
    • 8.1.1 起源
    • 8.1.2 Activity形態
    • 8.1.3 生命週期
  • 8.2 Activity任務棧簡介
  • 8.3 ActivityManifest啟動模式
    • 8.3.1 standard
    • 8.3.2 singleTop
    • 8.3.3 singleTask
    • 8.3.4 singleInstance
  • 8.4 Intent Flag啟動模式
  • 8.5 清空任務棧
  • 8.6 Activity任務棧使用

四大組件中出現頻率最高的組件

Activity是與使用者互動的第一介面,它提供了一個使用者完成指令的視窗,系統採用Activity棧的方式來管理Activity

  • Activity/Running
    Activity處於Activity棧的最頂層,可見,並與使用者進行互動
  • Paused
    當Activity失去焦點,被一個新的非全屏的Activity或者一個透明的Activity放置在棧頂時,Activity就轉換成了Paused形態,但它只是失去了與使用者互動的能力,所有狀態資訊,成員變數都還保留著,只有在系統記憶體極地的情況下,才會被系統回收掉
  • Stopped
    如果一個Activity被另一個Activity完全覆蓋,那麼Activity就會進入stop形態,此時他不再可見,但卻依然保持了所有狀態資訊和成員變數
  • Killed
    當Activity被系統回收或者Activity從來沒有建立過,Activity就處於Killed狀態

Google經典生命週期圖:

由於Android群英傳介紹的不詳細,我採用Android開發藝術探索這本書介紹生命週期:

  • onCreate:表示Activity正在被建立,這是生命週期的第一個方法,在這個方法可以做一些初始化工作,比如調用setContentView去載入介面布局資源、初始化Activity所需資料等
  • onRestart:表示Activity正在重新啟動,一般情況下,噹噹前Activity從不可見重新變為可見狀態時,onRestart就會被調用,這種情形一般是使用者行為所導致的,比如使用者按Home鍵切換到案頭或者使用者開啟一個新的Activity,這是當前的Activity就會暫停,也就是onPause和onStop被執行了,接著使用者又回到了這個Activity,就會出現這種情況
  • onStart:表示Activity正在被啟動,即將開始,這時Activity已經可見了,但是還沒有出現在前台,還無法和使用者互動,這個時候其實可以理解為Activity已經顯示出來了,但是我們還看不到
  • onResume:表示Activity已經可見了,並且出現在前台並開始活動,要注意這個和onStart的對比,onStart和onResume都表示Activity已經可見,但是onStart的時候Activity還在後台,onResume的時候Activity才顯示在前台
  • onPause:表示Activity正在停止,正常情況下,緊接著onStop就會被調用,在特殊情況下,如果這個時候快速地再回到當前Activity,那麼onResume會被調用,筆者的理解是,這種情況屬於極端情況,使用者操作很難重現這一情境,此時可以做一些儲存資料、停止動畫等工作,但是注意不能太耗時,因為這會影響到新Activity顯示,onPause必須先執行完,新Activity的onResume才會執行
  • onStop:表示Activity即將停止,可以做一些稍微重量級的回收工作,同樣不能太耗時
  • onDestroy:表示Activity即將被銷毀,這是Activity生命週期最後一個回調,在這裡,我們可以做一些回收工作和最終的資源釋放

除生命週期外,還有Activity的狀態會儲存起來:

  • 如果你長時間處於stopped狀態而且此時系統需要更多記憶體或者系統記憶體極為緊張時,系統會回收你的Activity,而此時系統為了補償你,會將Activity狀態通過onSaveInstanceState()方法儲存到Bundle對象中,當你需要重新建立這些Activity的時候,儲存的Bundle對象就會傳遞到Activity的onRestoreInstanceState()方法與onCreate()方法中,即可調用該方法恢複被銷毀時的狀態
  • 當一個App啟動時,如果當前環境下不存在該App的任務棧,那麼系統就會建立一個任務棧,此後,這個App所啟動的Activity都將在這個任務棧中被管理,這個棧也被稱為一個Task,即表示若干個Activity的集合,他們組成在一起形成一個Task,特別要注意的是,一個Task中的Activity可以來自不同的App,同一個App的Activity也可能不在一個Task中

  • 棧的結構是後進先出的線性表,通過在AndroidManifest檔案中的屬性android:launchMode來設定或者是通過Intent的flag來設定的

Manifest提供了四種啟動模式:

  • standard
  • singleTop
  • singleTask
  • singleInstance

對於這四種啟動模式可以簡單的在我另一篇部落格理解一下:四種啟動模式

  • Intent.FLAG-ACTIVITY-NEW-TASK:使用一個新的Task來啟動一個Activity,但啟動的每個Aetivity都將在一個新的Task中,該Flag通常使用在從service中啟動的actiity情境,由於在Service中並不存在Activity棧,所以使用該Flag來建立一個新的Activity棧,並建立新的Activity執行個體
  • FLAG-ACTIVITY-SINGLE-TOP:使用singletop模式來啟動一個Activity,與指定android:launchMode=”singleTop”效果相同
  • FLAG-ACTIVITY-CLEAR-Top:使用SingleTask模式來啟動一個Activity,與指定android:launchMode=”singleTask”效果相同
  • FLAG-ACTIVITY-NO-HISTORY:使用這種模式啟動Acuvity,當該Activity啟動其他AcuVity後,該Activity就消失了,不會保留在Activity棧中,例如A-B,B中以這種模式啟動C,C再啟動D,則當前Activity棧為ABD

系統同樣提供了清空任務棧的方法讓我們將一個Task全部清除,通常可以在AndroidManifest的<activity>標籤中使用下面屬性來清理:

  • clearTaskOnLaunch:每次返回Activity的時候,都將該Activity上的所有Activity都清除,雅思基礎通過這個屬性,可以讓這個Task每次初始化的時候,都只有一個Activity
  • finishTaskOnLaunch:這個屬性和clearTaskOnLaunch有點類似,只不過clearTaskOnLaunch作用在別人身上,而finishTaskOnLaunch作用在自己身上,通過這個屬性,當離開這個Activity所處的Task,那麼使用者再返回的時候,該Activity會被finish掉
  • alwaysRetainTaskState:Task的一道免死金牌,如果將Activity這個屬性設定為true,那麼該Activity所在的Task將不接受任何清除命令,一直保持當前Task的狀態

無知識點

Android群英傳知識點回顧——第八章:Activity與Activity調用棧分析

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.