天天看點

Android Activity 初識(一)

一、什麼是Activity

  1. Activity 是使用者接口程式(Android系統中的四大元件之一),原則上它會提供給使用者一個互動式的接口功能(可以用于顯示View)。它是 android 應用程式的基本功能單元。Activity 本身是沒有界面的,是以activity類建立了一個視窗,開發人員可以通過setContentView(View)接口把UI放到activity建立的視窗上,當activity指向全屏視窗時,也可以用其他方式實作:作為漂浮視窗(通過windowIsFloating的主題集合),或者嵌入到其他的activity(使用ActivityGroup)。activity是單獨的,用于處理使用者操作。幾乎所有的activity都要和使用者打交道。

二、activity生命周期

  1. 生命周期圖
    Android Activity 初識(一)
  2. 函數控制
public class Activity extends ApplicationContext {

    protected void onCreate(Bundle savedInstanceState);

    protected void onStart();

    protected void onRestart();

    protected void onResume();

    protected void onPause();

    protected void onStop();

    protected void onDestroy();

}
           
  • 在一個Activity正常啟動過程中,這些方法調用的順序是:

    onCreate -> onStart -> onResume;

    在Activity被kill掉的時候方法順序是:

    onPause -> onStop -> onDestroy;

    此為一個完整的Lifecycle。

    那麼對于中斷處理(比如電話來了),則是onPause -> onStop,恢複時onStart -> onResume;

    如果目前應用程式的是一個Theme為Translucent(半透明) 或者Dialog 的Activity那麼中斷就是onPause ,恢複的時候onResume。

  • onCreate:在這裡建立界面,做一些資料的初始化工作;這個也是執行setContentView(View)函數的地方,setContentView(View)函數可以傳入一個由XML

    編制的UI界面,可以使UI和具體實作完全分離。

  • onStart: 到這一步變成“使用者可見不可互動”的狀态;
  • onResume:變成和使用者可互動的,(在Activity棧系統通過棧的方式管理這些Activity,即目前Activity在棧的最上端,運作完彈出棧,則回到上一個Activity);
  • onPause:到這一步是可見但不可互動的,系統會停止動畫等消耗CPU的事情。從上文的描述已經知道,應該在這裡儲存你的一些資料,因為這個時候你的程式的優先級降低,有可能被系統收回。在這裡儲存的資料,應該在onResume裡讀出來。更重要的是,任何在目前Activity中的任何改變都要在這個函數中送出。
  • onStop:變得不可見 ,被下一個activity覆寫了
  • onDestroy:這是Activity被kill前最後一個被調用方法了,可能是其他類調用finish方法或者是系統為了節省空間将它暫時性的幹掉,可以用isFinishing()來判斷它,如果你有一個Progress Dialog線上程中運作,請在onDestroy裡把他cancel掉,不然等線程結束的時候,調用Dialog的cancel方法會抛異常。onPause,onstop, onDestroy,三種狀态下 activity都有可能被系統kill 掉。

三、 Activity的四種狀态

  • Activity有四種狀态:
  • 活動狀态(active):當Activity處于Stack(棧)頂時,就是手機目前的現實螢幕,這是 Activity就處于activity或者運作狀态。
  • 運作但是失去焦點:當Activity還處于運作狀态時,但是螢幕是有另外一個Activity處于文檔處于焦點狀态,目前的Activity就處于pause。
  • 停止:當Activity被另一個Activity完全覆寫的時候,就被停止了,其實就是雖然在運作,但是使用者卻看不見
  • 結束:當Activity處于pause或者stop時,系統可以結束 Activity,回收資源,這是Activity就是處于結束狀态了。

    處于結束狀态的是Activity,如果要使使用者可見,隻要重新開機才可以。

四、Activity的響應時間

  • 目前Activity所在的線程為主線程,它的響應時間為5秒,如果在目前運作的Activity中進行耗時的操作且響應時間起過5秒,那麼程式就會報ANR錯誤。是以,這也是不建議在Activity中寫太多複雜代碼的原因之一。

    當然,有些代碼隻能寫在Activity中,不然就運作不了(它們不是生命周期方法),比如你想要獲得android系統或者硬體一的些資訊,就必須在Activity中寫出來,如果單獨寫一個工具類獲得不了。

五、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。

六、Activity的棧式管理

  • Android針對Activity的管理使用的是棧,就是說某一個時刻隻有一個Activity處在棧頂,當這個Activity被銷毀後,下面的Activity才有可能浮到棧頂,或者有一個新的Activity被建立出來,則舊的Activity就被壓棧沉下去了。Activity是Android程式的表現層。程式的每一個顯示螢幕就是一個Activity。正在運作的Activity處在棧的最頂端,它是運作狀态的。
    Android Activity 初識(一)
    當在程式中調用 Activity.finish()方法時,結果和使用者按下 BACK 鍵一樣:它告訴 Activity Manager該Activity執行個體可以被“回收”。随後 Activity Manager 激活處于棧第二層的 Activity ,把原 Activity 壓入到棧的第二層,從 Running 狀态轉到 Paused 狀态。

七、Activity的跳轉

  • Activity跳轉,無傳回結果

    這是最簡單的Activity跳轉方式。從一個Activity啟動另一個Activity,直接startActivity(new Intent(目前Activity.this, 下一Activity.class))

  • Activity跳轉,傳回資料/結果

    需要傳回資料或結果的,則使用

    startActivityForResult (Intent intent, int requestCode);

    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沒反應。