* Activity的創建和銷毀 *
onCreate()
: 執行Activity某些基本設置的一些代碼,比如聲明用戶界面(xml文件),定義成員變量,配置某些UI等等,oncreate一般是必須要實現的.
Activity開始和停止
onStart()
: onStop() 方法應基本清理所有Activity的資源,將需要在Activity重新開始時重新實例化它們。但是,還需要在Activity初次創建時重新實例化它們(沒有Activity的現有實例)。出于此原因,應經常使用 onStart() 回調方法作為 onStop() 方法的對應部分,因為系統會在它創建您的Activity以及從停止狀態重新開始Activity時調用 onStart() 。
onStop()
: Activity收到 onStop() 方法的調用時,它不再可見,并且應釋放幾乎所有用戶不使用時不需要的資源。 一旦您的Activity停止,如果需要恢復系統內存,系統可能會銷毀該實例。 在極端情況下,系統可能會僅終止應用進程,而不會調用Activity的最終 onDestroy() 回調,因此您使用 onStop() 釋放可能泄露內存的資源非常重要。盡管 onPause() 方法在 onStop()之前調用,您應使用 onStop() 執行更大、占用更多 CPU 的關閉操作,比如向數據庫寫入信息。
Activity運行和暫停
onResume():
Activity獲得焦點,實現onResume()初始化在 onPause() 期間釋放的組件并且執行每當Activity進入“繼續”狀態時必須進行的任何其他初始化操作(比如開始動畫和初始化只在Activity具有用戶焦點時使用的組件)。
onPause()
: 當系統為您的Activity調用 onPause() 時,它從技術角度看意味著您的Activity仍然處于部分可見狀態,但往往說明用戶即將離開Activity并且它很快就要進入“停止”狀態。 您通常應使用 onPause() 回調:
數據存儲與恢復:
當系統開始停止您的Activity時,它會 調用 onSaveInstanceState() (1),因此,您可以指定您希望在 Activity 實例必須重新創建時保存的額外狀態數據。如果Activity被銷毀且必須重新創建相同的實例,系統將在 (1) 中定義的狀態數據同時傳遞給 onCreate() 方法(2) 和 onRestoreInstanceState() 方法(3)。
onSaveInstanceState()
:處于onstop()方法前, 但是與onpause()沒有多少必然的聯系,可能在onPause()前調用,也可能在onStop()前調用
onRestoreInstanceState()
: 處于onresume前,您可以選擇實現系統在 onStart() 方法之后調用的 onRestoreInstanceState(),而不是在onCreate() 期間恢復狀態。 系統只在存在要恢復的已保存狀態時調用 onRestoreInstanceState() ,因此您無需檢查 Bundle 是否為 null:
還有一些的其他的生命周期方法:
onPostCreate()
: 當activity建立后調用,即在onstart()和onRestoreInstanceState()完成后調用onPostResume()
: onCreate->onStart->onPostCreate->onResume->onPostResumeonSaveInstanceState方法在Activity的哪兩個生命周期方法之間調用?
onSaveInstanceState()的調用與onPause()的調用沒有先后之分,可能在onStop()前,也可能在onPause()前,但是可以保證一定在onStop()之前.
彈出一個Dialog時,onPause會調用嗎?什么情況下會,什么情況下不會?
首先,彈出的是本Activity的Dialog,并不會有任何生命周期方法調用。Dialog是一個View,它本身就依附在Acitivty上,可以理解為是屬于本Activity的,所以它的焦點也自然是本Activity的焦點,自然不會有什么生命周期方法調用了。如果其他Activity的Dialog彈出了,onPause才會調用。
橫豎屏切換的時候,生命周期方法是如何調用的?如何進行配置呢?
**橫豎屏切換時,如果不做任何配置,生命周期方法的回調順序為: onPause–onSaveInstanceState–onStop–onDestory–onCreate–onStart–onResume
也就是說Activity被銷毀并重建了。如果不想這樣可以在清單文件中的Activity添加一行配置: android:configChanges="keyboardHidden|orientation|screenSize"
**
Activity調用了onDestory方法,就會在Activity的任務棧消失嗎?
如果是點擊back鍵銷毀Activity,相當于調用了Activity的finish(),將Activity從任務棧中退出,再調用onDestroy(),如果Activity是意外被銷毀,直接調用onDestroy(),Activity是不會從任務棧中清除的.
永久性質的數據,應該在哪個生命周期方法中保存?
由于系統在緊急情況必須內存,onPause(),onStop(),onDestroy()三個方法,唯一能保證調用的只有onPause()方法,其他兩個方法可能不會調用,所以在此方法中做重要數據的持久化存儲,但是要注意的是,onPause()是非常輕量級的,不能做耗時操作,而由于無法保證系統會調用 onSaveInstanceState(),只應利用它來記錄 Activity 的瞬態(UI 的狀態)而切勿使用它來存儲持久性數據
在onCreate或者onRestoreInstance方法中恢復數據時,有什么區別?
區別: onRestoreInstanceState()一旦被調用,其參數Bundle saveInstance一定是有值的,我們不需要額外判斷是否為null,但是onCreate()卻不行,onCreate()正常啟動,其參數Bundle saveInstance()為null,這個需要額外去判斷.官方建議采用onResotreInstanceState()去恢復數據.
Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它們不同于 onCreate()、onPause()等生命周期方法,它們并不一定會被觸發。當應用遇到意外情況(如:內存不足、用戶直接按Home鍵)由系統銷毀一個Activity時,onSaveInstanceState() 會被調用。但是當用戶主動去銷毀一個Activity時,例如在應用中按返回鍵,onSaveInstanceState()就不會被調用。因為在這種情況下,用戶的行為決定了不需要保存Activity的狀態。通常onSaveInstanceState()只適合用于保存一些臨時性的狀態,而onPause()適合用于數據的持久化保存。onRestoreInstanceState()在onStart() 和 onPostCreate(Bundle)之間調用。
如果一個Activity在用戶可見時才處理某個廣播,不可見時注銷掉,那么應該在哪兩個生命周期的回調方法去注冊和注銷BroadcastReceiver呢?
應在onStart()中注冊,而在onStop()中注銷;一般情況下會選擇在onStop()和onDestroy()中進行資源釋放的操作, onPause() 調用期間必須保留的信息有所選擇,因為該方法中的任何阻止過程都會妨礙向下一個 Activity 的轉變并拖慢用戶體驗。.
如果有一些數據在Activity跳轉時(或者離開時)要保存到數據庫,那么你認為是在onPause好還是在onStop執行這個操作好呢?
Activity A啟動 Activity B必須要經歷的生命周期為: Activity A先調用onPause(),然后Activity B調用onCreate(),onStart(),onResume(),接著Activity A再調用onStop().故而,Activity A在跳轉前需要先在onPause()中將數據持久化存儲,以便Activity B可以調用.
standard
:標準模式.系統默認的啟動模式,每次啟動一個Activity都會重新創建一個新的實例,不管這個實例是否存在.誰啟動了這Activity,那么這個Activity就運行在那個Activity所在的棧中.如果啟動Activity時傳入applicationContext會報錯,因為非Activity類型Context并沒有所謂的棧,解決這個問題需要給待啟動Activity設置FLAG_ACTIVITY_NEW_TASK
標記位,相當于以singleTask模式啟動.
singleTop
: 棧頂復用模式.如果新Activity已經為棧頂,那么Activity不會被重新創建,同時onNewIntent()會被調用,但是Activity的onCreate()和onStart()不會被調用;如果新的Activity存在但是不在棧頂,那么Activity仍然會重新創建.
singleTask
: 棧內復用模式.只要Activity在一個棧中存在,多次啟動Activity都不會重新創建實例,和singleTop一樣,系統會調用onNewIntent().但是singleTask模式具有clearTop的效果,會導致棧內待啟動Activity上面的Activity被出棧.
singleInstance
: 單例模式.singleInstance是一種加強版的singleTask模式,具有此啟動模式Activity單獨存在一個棧內復用.
假如目前有2個任務棧,前臺任務棧有12,而后臺任務棧有XY,假設CD的啟動模式均為singleTask,那么啟動Y時,整個后臺任務棧都會被切換到前臺,這時后退列表就變為12XY,當點擊back鍵時,列表中Activity會一一出棧.
但是啟動的不是Y而是X,情況就不一樣了.
TaskAffinity
: 任務相關性.
這個參數標識一個Activity所需要的任務棧的名稱,默認情況為應用包名.當然,可以為每個Activity指單獨的TaskAffinity屬性,屬性名需和包名不同,否則沒有意義.TaskAffinity屬性主要和singleTask啟動模式以及allowTaskReparenting屬性配對使用,其他情況沒有意義.另外任務棧分為前臺任務棧和后臺任務棧,后臺任務棧中所有Activity處于暫停狀態.
當TaskAffinity與singleTask啟動模式使用時, 他具有該模式Activity目前任務棧的名稱,待啟動的Activity會運行在名字和TaskAffinity相同的任務棧.
當TaskAffinity與allowTaskReparenting結合使用時,情況比較復雜,會產生特殊的效果.
如果用戶長時間離開任務,則系統會清除所有 Activity 的任務,根 Activity 除外。 當用戶再次返回到任務時,僅恢復根 Activity。系統這樣做的原因是,經過很長一段時間后,用戶可能已經放棄之前執行的操作,返回到任務是要開始執行新的操作。可以使用下列幾個 Activity 屬性修改此行為:
alwaysRetainTaskState
如果在任務的根 Activity 中將此屬性設置為 “true”,則不會發生剛才所述的默認行為。即使在很長一段時間后,任務仍將所有 Activity 保留在其堆棧中。
clearTaskOnLaunch
如果在任務的根 Activity 中將此屬性設置為 “true”,則每當用戶離開任務然后返回時,系統都會將堆棧清除到只剩下根 Activity。 換而言之,它與 alwaysRetainTaskState 正好相反。 即使只離開任務片刻時間,用戶也始終會返回到任務的初始狀態。
finishOnTaskLaunch
此屬性類似于 clearTaskOnLaunch,但它對單個 Activity 起作用,而非整個任務。 此外,它還有可能會導致任何 Activity 停止,包括根 Activity。 設置為 “true” 時,Activity 仍是任務的一部分,但是僅限于當前會話。如果用戶離開然后返回任務,則任務將不復存在。
FLAG_ACTIVITY_NEW_TASK
:
該標記的作用是為Activity指定”singleTask”啟動模式,效果和XML中指定一樣. service中啟動activity需要用到此標記.
FLAG_ACTIVITY_SINGLE_TOP
:
該標記的作用是為Activity指定”singleTop”啟動模式,效果和XML中指定一樣.
FLAG_ACTIVITY_CLEAR_TOP
:
具有此標記的Activity,當啟動時,在同一個任務棧中所有位于他上面的Activity都要被清除出棧,此標記一般與singleTask啟動模式一起使用.在這種情況下,若被啟動Activity的實例已經存在,那么系統會調用onNewIntent.如果被啟動Activity采用的standard模式,那么連同他之上的activity都要出棧,系統會創建新的activity實例放入棧頂.
新聞熱點
疑難解答