Activity 生命週期與狀態保存

看API的時候,零零散散的記錄下來的,看完了總算對Activity的生命週期有了一個全面的瞭解。相信會對你們有些幫助的。php

onCreate->onRestart->onStart->onResume->onPause->onStop->onDestroyandroid

正常啓動一個Activity網絡

onCreate->onStart->onResumeapp

彈出系統對話框,程序仍部分可見ide

onPause函數

對話框消失時動畫

onResumespa

調用一個新的Activity,老的Activity不可見時.net

onPause->onStopcode

重新的Activity返回時

onRestart->onStart->onResume

正常運行的Activity正常結束時

onPause->onStop->onDestroy

onResume

這不是用來判斷Activity是否對用戶可見的最好方法。即便這個方法被調用後,也可能有一些系統窗口在咱們的Activity前面,如keyguard。onWindowFocusChanged是最準確的。

對於一些沒有經過相似managedQuery(android.net.Uri , String[], String, String[], String)這樣的方法交給系統管理的Cursor來講,這個時候應該從新獲取。由於,按照理論來講,在onStop時,你把它們deactive了。

假設Activity A啓動一個Activity B,那麼,系統會先調用A的onPause,而後調用B的onCreate、onStart、onResume。而後纔會調用A的onStop方法。

所以,在舊的Activity的onPause返回以前,新的Activity不會被建立。所以,這裏不要作太費時的事情。

onPause方法中建議作的操做有:中止動畫這樣大量消耗CPU的動做,使Activity的切換更快速;關掉相機這樣獨佔式訪問的資源。

後臺Activity由於資源緊張被系統終止時,不管是否可見,都不會調用任何方法,除onSaveInstanceState。

經過android.os.Process.killProcess殺死時,不會調用任何方法,包括onSaveInstanceState。

關於狀態保存

onSaveInstanceState

當Activity被切換到後臺(部分可見或者不可見,但己不與用戶交互)時,就有可能由於資源緊張而被kill,會調用這個方法。

若是這個方法被調用的話,會在onStop以前,但與onPause誰先誰後不肯定。

這個方法的默認實現中,保存了當前可見的View樹的狀態,重寫時,若是要保留這個特性的話,調一下super.onSaveInstanceState。

onRestoreInstanceState

這個方法在onStart和onResume之間被調用。

絕大部分狀況下,使用onCreate就能夠恢復上一次保存的狀態。

 

-------------------------------------------------------

 

Activity

Android中,Activity是全部程序的根本,全部程序的流程都運行在Activity之中,Activity具備本身的生命週期,由系統控制生命週期,程序沒法改變,但能夠用onSaveInstanceState保存其狀態。

對於Activity,關鍵是其生命週期的把握(以下圖),其次就是狀態的保存和恢復(onSaveInstanceState onRestoreInstanceState),以及Activity之間的跳轉和數據傳輸(intent)。

activity_lifecycle

Activity中經常使用的函數有SetContentView()   findViewById()    finish()   startActivity(),其生命週期涉及的函數有:

void onCreate(Bundle savedInstanceState)
void onStart()
void onRestart()
void onResume()
void onPause()
void onStop()
void onDestroy()

注意的是,Activity的使用須要在Manifest文件中添加相應的<Activity>,並設置其屬性和intent-filter。

Intent

Android中提供了Intent機制來協助應用間的交互與通信,Intent負責對應用中一次操做的動做、動做涉及數據、附加數據進行描述,Android則根據此Intent的描述,負責找到對應的組件,將 Intent傳遞給調用的組件,並完成組件的調用。Intent不只可用於應用程序之間,也可用於應用程序內部的Activity/Service之間的交互。所以,Intent在這裏起着一個媒體中介的做用,專門提供組件互相調用的相關信息,實現調用者與被調用者之間的解耦。在SDK中給出了Intent做用的表現形式爲:

  • 經過Context.startActivity() orActivity.startActivityForResult() 啓動一個Activity;
  • 經過 Context.startService() 啓動一個服務,或者經過Context.bindService() 和後臺服務交互;
  • 經過廣播方法(好比 Context.sendBroadcast(),Context.sendOrderedBroadcast(),  Context.sendStickyBroadcast()) 發給broadcast receivers。

Intent屬性的設置,包括如下幾點:(如下爲XML中定義,固然也能夠經過Intent類的方法來獲取和設置)

(1)Action,也就是要執行的動做

SDk中定義了一些標準的動做,包括

onstant Target component Action
ACTION_CALL activity Initiate a phone call.
ACTION_EDIT activity Display data for the user to edit.
ACTION_MAIN activity Start up as the initial activity of a task, with no data input and no returned output.
ACTION_SYNC activity Synchronize data on a server with data on the mobile device.
ACTION_BATTERY_LOW broadcast receiver A warning that the battery is low.
ACTION_HEADSET_PLUG broadcast receiver A headset has been plugged into the device, or unplugged from it.
ACTION_SCREEN_ON broadcast receiver The screen has been turned on.
ACTION_TIMEZONE_CHANGED broadcast receiver The setting for the time zone has changed.

 

固然,也能夠自定義動做(自定義的動做在使用時,須要加上包名做爲前綴,如"com.example.project.SHOW_COLOR」),並可定義相應的Activity來處理咱們的自定義動做。

(2)Data,也就是執行動做要操做的數據

Android中採用指向數據的一個URI來表示,如在聯繫人應用中,一個指向某聯繫人的URI可能爲:content://contacts/1。對於不一樣的動做,其URI數據的類型是不一樣的(能夠設置type屬性指定特定類型數據),如ACTION_EDIT指定Data爲文件URI,打電話爲tel:URI,訪問網絡爲http:URI,而由content provider提供的數據則爲content: URIs。

(3)type(數據類型),顯式指定Intent的數據類型(MIME)。通常Intent的數據類型可以根據數據自己進行斷定,可是經過設置這個屬性,能夠強制採用顯式指定的類型而再也不進行推導。

(4)category(類別),被執行動做的附加信息。例如 LAUNCHER_CATEGORY 表示Intent 的接受者應該在Launcher中做爲頂級應用出現;而ALTERNATIVE_CATEGORY表示當前的Intent是一系列的可選動做中的一個,這些動做能夠在同一塊數據上執行。還有其餘的爲

Constant Meaning
CATEGORY_BROWSABLE The target activity can be safely invoked by the browser to display data referenced by a link — for example, an image or an e-mail message.
CATEGORY_GADGET The activity can be embedded inside of another activity that hosts gadgets.
CATEGORY_HOME The activity displays the home screen, the first screen the user sees when the device is turned on or when the HOME key is pressed.
CATEGORY_LAUNCHER The activity can be the initial activity of a task and is listed in the top-level application launcher.
CATEGORY_PREFERENCE The target activity is a preference panel.

 

(5)component(組件),指定Intent的的目標組件的類名稱。一般 Android會根據Intent 中包含的其它屬性的信息,好比action、data/type、category進行查找,最終找到一個與之匹配的目標組件。可是,若是 component這個屬性有指定的話,將直接使用它指定的組件,而再也不執行上述查找過程。指定了這個屬性之後,Intent的其它全部屬性都是可選的。

(6)extras(附加信息),是其它全部附加信息的集合。使用extras能夠爲組件提供擴展信息,好比,若是要執行「發送電子郵件」這個動做,能夠將電子郵件的標題、正文等保存在extras裏,傳給電子郵件發送組件。

理解Intent的關鍵之一是理解清楚Intent的兩種基本用法:一種是顯式的Intent,即在構造Intent對象時就指定接收者;另外一種是隱式的Intent,即Intent的發送者在構造Intent對象時,並不知道也不關心接收者是誰,有利於下降發送者和接收者之間的耦合。

相關文章
相關標籤/搜索