Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 四大組件之 Activity

四大組件之 Activity

編輯:關於Android編程

一、什麼是activity

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

二、activity生命周期

image

public class Activity extends ApplicationContext {
    //activity被創建
    protected void onCreate(Bundle savedInstanceState);
    //activity開始運行
    protected void onStart();
    //activity重新被調起運行
    protected void onRestart();
    //activity運行中
    protected void onResume();
    //activity被暫停運行
    protected void onPause();
    //activity停止運行
    protected void onStop();
    //activity被銷毀
    protected void onDestroy();

}

由圖可知:

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

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

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

????onCreate:在這裡創建界面,做一些數據的初始化工作;

????onStart: 到這一步變成“用戶可見不可交互”的狀態;

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

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

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

????onDestroy:這是Activity被kill前最後一個被調用方法了,可能是其他類調用finish方法或者是系統為了節省空間將它暫時性的干掉,可以用isFinishing()來判斷它,如果你有一個ProgressDialog在線程中運行,請在onDestroy裡把他cancel掉,不然等線程結束的時候,調用Dialog的cancel方法會拋異常。

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

三、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 的 Intent Filter

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

????當使用 startActivity(intent) 來啟動另外一個 Activity 時,如果直接指定 intent 對象的 Component 屬性,那麼 Activity Manager 將試圖啟動其 Component 屬性指定的 Activity。否則 Android 將通過 Intent 的其它屬性從安裝在系統中的所有 Activity 中查找與之最匹配的一個啟動,如果沒有找到合適的 Activity,應用程序會得到一個系統拋出的異常。這個匹配的過程如下:

image

五、Activity的棧式管理

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

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

六、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鍵,如果按下了返回鍵,則無效

standard 默認的啟動模式,標准模式 singletop 單一頂部模式 (頂部不會重復) singleTask 單一任務棧,干掉頭上的其他Activity singleInstance 單一實例(單例),任務棧裡面自已自己一個人

七、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裡面。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved