Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 第八章:Activity與Activity調用棧分析

第八章:Activity與Activity調用棧分析

編輯:關於Android編程

知識點目錄

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任務棧使用

知識點回顧

8.1 Activity

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

8.1.1 起源

Activity是與用戶交互的第一接口,它提供了一個用戶完成指令的窗口,系統采用Activity棧的方式來管理Activity

8.1.2 Activity形態

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

8.1.3 生命周期

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()方法中,即可調用該方法恢復被銷毀時的狀態

8.2 Android任務棧簡介

當一個App啟動時,如果當前環境下不存在該App的任務棧,那麼系統就會創建一個任務棧,此後,這個App所啟動的Activity都將在這個任務棧中被管理,這個棧也被稱為一個Task,即表示若干個Activity的集合,他們組成在一起形成一個Task,特別要注意的是,一個Task中的Activity可以來自不同的App,同一個App的Activity也可能不在一個Task中

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

8.3 AndroidManifest啟動模式

Manifest提供了四種啟動模式:

standard singleTop singleTask singleInstance

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

8.4 Intent Flag啟動模式

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

8.5 清空任務棧

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

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

8.6 Activity任務棧使用

無知識點

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved