activity總結

1、什麼是activityandroid

 Activity 是用戶接口程序,原則上它會提供給用戶一個交互式的接口功能。它是 android 應用程序的基本功能單元。Activity 自己是沒有界面的。因此activity類建立了一個窗口,開發人員能夠經過setContentView(View)接口把UI放到activity建立的窗口上,當activity指向全屏窗口時,也能夠用其餘方式實現:做爲漂浮窗口(經過windowIsFloating的主題集合),或者嵌入到其餘的activity(使用ActivityGroup)。activity是單獨的,用於處理用戶操做。幾乎全部的activity都要和用戶打交道,app

2、activity生命週期函數

  

View Code

由圖可知:動畫

  在一個Activity正常啓動過程當中,這些方法調用的順序是onCreate -> onStart -> onResume;在Activity被kill掉的時候方法順序是onPause -> onStop -> onDestroy,此爲一個完整的Lifecycle。那麼對於中斷處理(好比電話來了),則是onPause -> onStop,恢復時onStart -> onResume;若是當前應用程序的是一個Theme爲Translucent(半透明) 或者Dialog 的Activity那麼中斷就是onPause ,恢復的時候onResume。ui

  那麼對於」Other app need memory」,就是咱們手機在運行一個應用程序的時候,有可能打進來電話發進來短信,或者沒有電了,這時候程序都會被中斷,優先去服務電話的基本功能,另外系統也不容許你佔用太多資源,至少要保證一些功能(好比電話),因此資源不足的時候也就有可能被kill掉。this

方法在系統中的做用及咱們應該作什麼:spa

  onCreate:在這裏建立界面,作一些數據的初始化工做;線程

  onStart: 到這一步變成「用戶可見不可交互」的狀態;3d

  onResume:變成和用戶可交互的,(在Activity棧系統經過棧的方式管理這些Activity,即當前Activity在棧的最上端,運行完彈出棧,則回到上一個Activity);code

  onPause:到這一步是可見但不可交互的,系統會中止動畫等消耗CPU的事情。從上文的描述已經知道,應該在這裏保存你的一些數據,由於這個時候你的程序的優先級降          低,有可能被系統收回。在這裏保存的數據,應該在onResume裏讀出來。

  onStop:變得不可見 ,被下一個activity覆蓋了

  onDestroy:這是Activity被kill前最後一個被調用方法了,多是其餘類調用finish方法或者是系統爲了節省空間將它暫時性的幹掉,能夠用isFinishing()來判斷它,若是你有              一個Progress Dialog在線程中運行,請在onDestroy裏把他cancel掉,否則等線程結束的時候,調用Dialog的cancel方法會拋異常。

onPause,onstop, onDestroy,三種狀態下 activity都有可能被系統kill 掉。

3、Activity之間的通訊

  在 Android 中,不一樣的 Activity 實例可能運行在一個進程中,也可能運行在不一樣的進程中。所以咱們須要一種特別的機制幫助咱們在 Activity 之間傳遞消息。Android 中經過 Intent 對象來表示一條消息,一個 Intent 對象不只包含有這個消息的目的地,還能夠包含消息的內容,這比如一封 Email,其中不只應該包含收件地址,還能夠包含具體的內容。對於一個 Intent 對象,消息「目的地」是必須的,而內容則是可選項。

  Intent負責對操做的動做、動做涉及數據、附加數據進行描述,Android則根據此Intent的描述,負責找到對應的組件,將 Intent傳遞給調用的組件,並完成組件的調用。所以,Intent在這裏起着一個媒體中介的做用,專門提供組件互相調用的相關信息,實現調用者與被調用者之間的解耦。

  在應用中,咱們能夠以兩種形式來使用Intent:

  直接Intent:指定了component屬性的Intent(調用setComponent(ComponentName)或者setClass(Context, Class)來指定)。經過指定具體的組件類,通知應用啓動對應的組件。

  間接Intent:沒有指定comonent屬性的Intent。這些Intent須要包含足夠的信息,這樣系統才能根據這些信息,在在全部的可用組件中,肯定知足此Intent的組件。
      對於直接Intent,Android不須要去作解析,由於目標組件已經很明確。

  Android須要解析的是那些間接Intent,經過解析,將 Intent映射給能夠處理此Intent的Activity、IntentReceiver或Service。Intent解析機制主要是經過查找已註冊在AndroidManifest.xml中的全部IntentFilter及其中定義的Intent,最終找到匹配的Intent。

4、Activity 的 Intent Filter

  Intent Filter 描述了一個組件願意接收什麼樣的 Intent 對象,Android 將其抽象爲 android.content.IntentFilter 類。在 Android 的 AndroidManifest.xml 配置文件中能夠經過 <intent-filter >節點爲一個 Activity 指定其 Intent Filter,以便告訴系統該 Activity 能夠響應什麼類型的 Intent。

  當使用 startActivity(intent) 來啓動另一個 Activity 時,若是直接指定 intent 對象的 Component 屬性,那麼 Activity Manager 將試圖啓動其 Component 屬性指定的 Activity。不然 Android 將經過 Intent 的其它屬性從安裝在系統中的全部 Activity 中查找與之最匹配的一個啓動,若是沒有找到合適的 Activity,應用程序會獲得一個系統拋出的異常。這個匹配的過程以下:

5、Activity的棧式管理

  Android針對Activity的管理使用的是棧,就是說某一個時刻只有一個Activity處在棧頂,當這個Activity被銷燬後,下面的Activity纔有可能浮到棧頂,或者有一個新的Activity被建立出來,則舊的Activity就被壓棧沉下去了。Activity是Android程序的表現層。程序的每個顯示屏幕就是一個Activity。正在運行的Activity處在棧的最頂端,它是運行狀態的。

                                       

當在程序中調用 Activity.finish()方法時,結果和用戶按下 BACK 鍵同樣:它告訴 Activity Manager該Activity實例能夠被「回收」。隨後 Activity Manager 激活處於棧第二層的 Activity ,把原 Activity 壓入到棧的第二層,從 Running 狀態轉到 Paused 狀態。

6、Activity的加載模式

standard、singleTop、singleTask、singleInstance(其中前兩個是一組、後兩個是一組),默認爲standard 

standard:就是intent將發送給新的實例,因此每次跳轉都會生成新的activity。

singleTop:也是發送新的實例,但不一樣standard的一點是,在請求的Activity正好位於棧頂時(配置成singleTop的Activity),不會構造新的實例

singleTask:和後面的singleInstance都只建立一個實例,當intent到來,須要建立設置爲singleTask的Activity的時候,系統會檢查棧裏面是否已經有該Activity的實例。若是有直接將intent發送給它。

singleInstance:

首先說明一下task這個概念,Task能夠認爲是一個棧,可放入多個Activity。好比啓動一個應用,那麼Android就建立了一個Task,而後啓動這個應用的入口Activity,那在它的界面上調用其餘的Activity也只是在這個task裏面。那若是在多個task中共享一個Activity的話怎麼辦呢。舉個例來講,若是開啓一個導遊服務類的應用程序,裏面有個Activity是開啓GOOGLE地圖的,當按下home鍵退回到主菜單又啓動GOOGLE地圖的應用時,顯示的就是剛纔的地圖,其實是同一個Activity,實際上這就引入了singleInstance。singleInstance模式就是將該Activity單獨放入一個棧中,這樣這個棧中只有這一個Activity,不一樣應用的intent都由這個Activity接收和展現,這樣就作到了共享。固然前提是這些應用都沒有被銷燬,因此剛纔是按下的HOME鍵,若是按下了返回鍵,則無效。

7、Activity的跳轉

Activity跳轉,無返回結果
   這是最簡單的Activity跳轉方式。從一個Activity啓動另外一個Activity,直接startActivity(new Intent(當前Activity.this, 下一Activity.class))。
Activity跳轉,返回數據/結果
   須要返回數據或結果的,則使用startActivityForResult (Intent intent, int requestCode),requestCode的值是自定義的,用於識別跳轉的目標Activity。跳轉的目標Activity所要作的就是返回數據/結果,setResult(int resultCode)只返回結果不帶數據,或者setResult(int resultCode, Intent data)二者都返回!而接收返回的數據/結果的處理函數是onActivityResult(int requestCode, int resultCode, Intent data),這裏的requestCode就是startActivityForResult的requestCode,resultCode就是setResult裏面的resultCode,返回的數據在data裏面。
   ** 注意,在setResult後,要調用finish()銷燬當前的Activity,不然沒法返回到原來的Activity,就沒法執行原來Activity的onActivityResult函數,看到當前的Activity沒反應。
  本人是個新手,沒什麼經驗,如發現有錯誤或者什麼好的建議,歡迎指正!請多多指教!
相關文章
相關標籤/搜索