看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中經常使用的函數有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對象時,並不知道也不關心接收者是誰,有利於下降發送者和接收者之間的耦合。