Activity是Android組件中最基本也是最爲常見用的四大組件(Activity活動,Service服務,Content Provider內容提供者,BroadcastReceiver廣播接收器)之一。 前端
Activity是「單任務焦點」的,也就是說用戶只能與一個active(running)的Activity交互。一個Activity一般就是一個單獨的屏幕/界面,負責管理界面上的各類控件(widgets),能夠在Activity的onCreate(Bundle savedInstanceState)方法中調用setContentView(int layoutResID) 向其添加視圖/控件, layoutResID爲在xml中定義的layout,能夠經過自動生成的R類訪問:R.layout.xxx。 android
Activity類的繼承關係及實現的主要接口以下圖所示,繼承自Activity的主要子類有FragmentActivity, ListActivity, NativeActivity, ActivityGroup 等。 安全
Activity做爲與用戶的交互界面,須要保持快速響應,通常5秒左右就會提示異常,所以在Activity中不作耗時的操做,以下載上傳數據。耗時操做可使用Service或者使用多線程。 多線程
Activity的使用首先須要深刻理解其生命週期 ide
Activity在應用程序的整個生命週期中扮演者重要的角色,系統採用一個「活動堆棧」來管理全部的Activity,一個新Activity啓動後會被放在堆棧頂部,並保持running狀態,前一個running的activity將被下壓並暫停,直到用戶back,新Activity退出後回到棧頂並running,這正是棧的先進後出原則。 動畫
Activity定義了大量的回調方法來完成整個生命週期,這些方法都是會自動調用的,能夠在Activity的子類中重載,添加所須要的邏輯代碼: spa
方法 .net |
簡介 線程 |
Killable? xml |
next方法 |
onCreate(Bundle) |
Activity建立後被調用的第一個方法,通常用來完成全部的靜態設置,如中建立views,ListView綁定數據,如調用:setContentView(int layoutResID) findViewById(int id)(ps:若是是fragment中的控件,該方法返回null,fragment是在該方法以後執行的) Bundle參數能夠用來恢復以前保持的狀態數據,橫豎屏切換的時候則會用到。 該方法調用以後通常會自動調用onStart()方法 |
No |
onStart() |
onRestart() |
Stopped狀態的Activity從新被調用的時候調用該方法。如用戶由其餘Activity返回的時候。 |
No |
onStart() |
onStart() |
在activity被調到前臺可見以前執行該方法。在建立onCreate後或者從新啓動onRestart後調用。該方法執行後,通常狀況下,系統會自動調用onResume()方法,異常狀況,也有可能直接調用onStop()方法。 |
No |
onResume() onStop() |
onResume() |
調用該方法後,Activity處於前臺可見、可交互狀態,Activity處於running狀態 |
No |
onPause() |
onPause() |
Activity在被其餘activity遮蓋以前執行該方法;Activity處於Paused狀態,在3.1以前的版本中在極端狀況下回被系統killed; 在這個方法中能夠用來保存持久化數據、中止動畫和其餘消耗cpu的事情等,只能執行輕量級的快速操做。 執行耗時的操做在onStop比較合適一些 |
|
onResume() onStop() |
onStop() |
Activity徹底不可見的時候執行該方法,好比:新的Activity啓動並覆蓋了當前的activity,或者返回到前一個Activity。當前Activity處於Stopped,隨時可能被系統銷燬,也有可能被從新啓動調到前臺。 異常狀況,該方法可能不會執行,Activity直接被killed掉 |
Yes |
onRestart() onDestroy() |
onDestroy() |
Activity資源被系統回收以前執行的最後一個方法,調用finish()或者系統臨時銷燬Activity的時候調用,可使用isFinishing()進行判斷是正常銷燬仍是異常狀況。 用戶改變設置(屏幕方向、語言、輸入設備等)當前Activity實例會被銷燬,而後從新建立一個新的實例; 異常狀況,該方法可能不會執行,Activity直接被killed掉 |
Yes |
|
|
其它重要方法 |
|
|
onSaveInstanceState(Bundle) |
可使用方法onSaveInstanceState(Bundle)保存狀態信息,如UI的變化信息,而後調用方法onCreate(Bundle)恢復; 在Activity生命週期內,一些狀況下該方法可能不會執行,用onPause()方法代替。 用戶按下home鍵、長按home鍵、按下電源鍵、啓動另一個activity、切換屏幕方向等onSaveInstanceState會被調用; |
|
|
用戶設置(如屏幕方向)改變觸發的回調方法。 Manifest.xml中配置android:configChanges,指定在哪些狀況下執行該方法,如」 locale|fontScale|orientation 」,經過這樣設置則Activity不從新建立,爲指定的配置改變,則會致使Activity從新建立。 在實際開發中橫豎屏切換等保留Activity不被從新建立是很是重要的。 |
|
|
|
onActivityResult(int,int, ntent) |
使用startActivityForResult方法啓動另一個Activity,在返回的時候觸發該事件。 參數: requestCode:請求碼,用來標記是由哪一個請求返回的結果,與startActivityForResult中的一致。 resultCode:結果碼,與setResult中的參數一致,經常使用的:RESULT_CANCELED ,RESULT_OK,RESULT_FIRST_USER等。 Data:附件的數據Intent對象, |
|
|
這些回調方法的調用順序:
Ø 第一次啓動:onCreate(Bundle)——onStart()——onResume(),完成調用後Activity在最前端與用戶是能夠交互的。
Ø 啓動後按下home鍵:onPause()——onStop()將Activity中止stoped,再次運行的時候調用順序:onRestart()——onStart()——onResume()。
Ø 啓動以後按下back鍵:onPause()——onStop()——onDestroy ()將Activity銷燬,調用:onCreate(Bundle)——onStart()——onResume()從新啓動
Ø 調用另一個Activity:onPause()——onStop()將當前Activity 中止stoped,而後調用新的Activity的onCreate(Bundle)——onStart()——onResume()將新Activity激活。
Ø 按下返回back鍵:onPause()——onStop()——onDestroy ()將當前的Activity銷燬,而後調用onRestart()——onStart()——onResume()從新回到前一個Activity。
在Activity的生命週期中,一般有四種狀態(running,paused,stopped,destroyed):
Ø Running:在屏幕最前面,界面是可見的、可交互的,運行在堆棧的頂部,執行完onResume()方法以後直到onPause()就是這個狀態。
Ø Paused:被其餘activity部分覆蓋的時候,界面可見但失去焦點,不可交互, activity是存活的(保留了全部狀態信息),當系統內存很低的時候可能會被直接killed掉。執行完onPause()後直到onStop()就是這個狀態。Paused狀態的Activity調用onResume方法後能夠從新回到活動狀態。
Ø Stopped:被其餘Activity徹底覆蓋的時候,仍保留了狀態信息,界面徹底不可見,Stopped狀態的Activity一般都會由於須要內存而被系統killed。執行完onStop()方法後直到onDestroy()就是這個狀態。Stopped狀態的Activity調用onRestart方法能夠從新回到活動狀態。
Ø Destroyed:處於Paused 或Stopped狀態的Activity,當系統要求(調用finish()方法)或者被移除killed,Activity則被Destroyed掉,系統能夠將其從內存中清除。Destroyed的 Activity代表其已經被銷燬,若是須要再使用者須要從新create。
一個Activity生命週期中,這些回調方法執行有三種的狀況:
Ø 全lifetime:從onCreate(Bundle)到onDestroy()。onCreate配置資源,onDestroy銷燬資源,如在onCreate中建立後臺線程,在onDestroy中中止。
Ø 可見lifetime: 從onStart() 到onStop()。Activity在屏幕上可見,有可能不在前臺,不能與用戶交互。onStart和onStop能夠被屢次執行。
Ø 前臺liftime:從onResume()到onPause()。Activity處於前臺,可以與用戶交互, resumed 和 paused狀態能夠屢次切換,這兩個方法中放在輕量級代碼。
Android是多任務系統,系統會對Activity進行一個優先級排序:
Ø foreground activity:位於屏幕最上層與用戶交互的Activity,其進程通常不會被killed,系統異常狀況下,也是最後被killed的。
Ø visible activity:可見不可交互的,優先級僅次於foreground activity。
Ø background activity:不可見,其進程可能會被系統安全的killed以回收內存,從新回到該Activity的時候,其onCreate(Bundle),onSaveInstanceState(Bundle)會被調用恢復狀態信息。
Ø empty process:沒有Activity或者組件在運行。系統會自動結束進程回收資源,所以,在activity以外執行後臺操做的時候須要在BroadcastReceiver,Service。
參考閱讀:http://my.oschina.net/keeponmoving/blog/60943