Android中的四大組件之-Activity

      首先,Activity是Android系統中的四大組件之一,可以用於顯示View。Activity是一個與用戶交互的系統模塊,幾乎所有的Activity都是和用戶進行交互的,但是如果這樣就能說Activity主要是用來顯示View就不太正確了。

      在深入瞭解Activity之前,我們先要知道一下MVC設計模式,在JAVAEE 中MVC設計模式已經很經典了,而且分的也比較清晰了,但是在Android中,好多人對MVC在Android開發中的應用不是很清楚,下面我就先來介紹一下MVC在Android開發中的應用:

  • M(Model 模型):Model是應用程序的主體部分,所有的業務邏輯都應該寫在這裏,在Android中Model層與JavaEE中的變化不大,如:對數據庫的操作,對網絡等的操作都放在該層(但不是說它們都放在同一個包中,可以分開放,但它們統稱爲Model層)。

  • V(View 視圖):是應用程序中負責生成用戶界面的部分,也是在整個MVC架構中用戶唯一可以看到的一層,接收用戶輸入,顯示處理結果;在Android應用中一般採用XML文件裏的界面的描述,使用的時候可以非常方便的引入,當然也可以使用JavaScript+Html等方式作爲View。

  • C(Controller控制層)android的控制層的重任就要落在衆多的activity的肩上了,所以在這裏就要建議大家不要在activity中寫太多的代碼,儘量通過activity交割Model業務邏輯層處理。

      好了,在介紹過Android應用開發中的MVC架構後,我們就可以很明確的知道,在Android中Activity主要是用來做控制的,它可以選擇要顯示的View,也可以從View中獲取數據然後把數據傳給Model層進行處理,最後再來顯示出處理結果。

Activity 生命週期

     Activity 的生命週期對開發強大而又靈活的應用至關重要,熟悉Acticity的生命週期,對能靈活應用Activity非常重要,也可以說是Activity使用的難點吧。Activity的生命週期是通過方法回調實現的。Activity 的生命週期會直接受到 Activity 與其他 Activity、其任務及返回棧的關聯性的影響。

1、Activity的三種存在的狀態:

  • 繼續(或運行中)
         此 Activity 位於屏幕前臺並具有用戶焦點,一般對應於onResume()方法。
  • 暫停
         另一個 Activity 位於屏幕前臺並具有用戶焦點,但此 Activity 仍可見,一般對應於onPause()方法。 暫停的 Activity 處於完全活動狀態(Activity 對象保留在內存中,它保留了所有狀態和成員信息,並與窗口管理器保持連接),但在內存極度不足的情況下,可能會被系統終止。
  • 停止
         該 Activity 被另一個 Activity 完全遮蓋,一般對應於onStop()方法。 已停止的 Activity 同樣仍處於活動狀態(Activity 對象保留在內存中,它保留了所有狀態和成員信息,但未與窗口管理器連接)。 不過,它對用戶不再可見,在他處需要內存時可能會被系統終止。

2、Activity的生命週期回調

當Activity進行狀態切換時,都會調用其相應的回調方法 以下MainActivity 包括每一個基本生命週期方法:

public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // The activity is being created.
    }
    @Override
    protected void onStart() {
        super.onStart();
        // The activity is about to become visible.
    }
    @Override
    protected void onResume() {
        super.onResume();
        // The activity has become visible (it is now "resumed").
    }
    @Override
    protected void onPause() {
        super.onPause();
        // Another activity is taking focus (this activity is about to be "paused").
    }
    @Override
    protected void onStop() {
        super.onStop();
        // The activity is no longer visible (it is now "stopped")
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        // The activity is about to be destroyed.
    }
}

這些方法共同實現了 Activity 的整個生命週期。您可以通過實現這些方法監控 Activity 生命週期中的三個嵌套循環:

  • Activity 的整個生命週期發生在 onCreate() 調用與 onDestroy() 調用之間。您的 Activity 應在 onCreate() 中執行“全局”狀態設置(例如定義佈局),並釋放 onDestroy()(例如後臺運行的線程) 中的所有其餘資源。

  • Activity 的可見生命週期發生在 onStart() 調用與 onStop() 調用之間。在這段時間,用戶可以在屏幕上看到 Activity 並與其交互。 例如,當一個新 Activity 啓動,並且此 Activity 不再可見時,系統會調用 onStop()。您可以在調用這兩個方法之間保留向用戶顯示 Activity 所需的資源。 例如,您可以在 onStart() 中註冊一個 BroadcastReceiver 以監控影響 UI 的變化,並在用戶無法再看到您顯示的內容時在 onStop() 中將其取消註冊。在 Activity 的整個生命週期,當 Activity 在對用戶可見和隱藏兩種狀態中交替變化時,系統可能會多次調用 onStart() 和 onStop()。

  • Activity 的前臺生命週期發生在 onResume() 調用與 onPause() 調用之間。在這段時間,Activity 位於屏幕上的所有其他 Activity 之前,並具有用戶輸入焦點。 Activity 可頻繁轉入和轉出前臺 — 例如,當設備轉入休眠狀態或出現對話框時,系統會調用 onPause()。 由於此狀態可能經常發生轉變,因此這兩個方法中應採用適度輕量級的代碼,以避免因轉變速度慢而讓用戶等待。

     下圖爲官方文檔上的 Activity生命週期變化圖,矩形表示回調方法,當 Activity 在不同狀態之間切換時,您可以重寫這些方法來執行相應的操作。


這裏寫圖片描述

下表列出了Activity中生命週期回調方法,其中對每一種回調方法做了更詳細的描述,並說明了每一種方法在 Activity 整個生命週期內的位置,包括在回調方法完成後系統能否終止 Activity。


這裏寫圖片描述

     名爲“是否能事後終止?”的列表示系統是否能在不執行另一行 Activity 代碼的情況下,在方法返回後隨時終止承載 Activity 的進程。 有三個方法帶有“是”標記:(onPause()、onStop() 和 onDestroy())。由於 onPause() 是這三個方法中的第一個,因此 Activity 創建後,onPause() 必定成爲最後調用的方法,然後才能終止進程 — 如果系統在緊急情況下必須恢復內存,則可能不會調用 onStop() 和 onDestroy()。因此,您應該使用 onPause() 向存儲設備寫入至關重要的持久性數據(例如用戶編輯)。不過,您應該對 onPause() 調用期間必須保留的信息有所選擇,因爲該方法中的任何阻止過程都會妨礙向下一個 Activity 的轉變並拖慢用戶體驗。
     在是否能在事後終止?列中標記爲“否”的方法可從系統調用它們的一刻起防止承載 Activity 的進程被終止。 因此,在從 onPause() 返回的時間到 onResume() 被調用的時間,系統可以終止 Activity。在 onPause() 被再次調用並返回前,將無法再次終止 Activity。
     注:根據表 1 中的定義屬於技術上無法“終止”的 Activity 仍可能被系統終止 — 但這種情況只有在無任何其他資源的極端情況下才會發生。

保存 Activity 狀態

     管理 Activity 生命週期的引言部分簡要提及,當 Activity 暫停或停止時,Activity 的狀態會得到保留。 確實如此,因爲當 Activity 暫停或停止時,Activity 對象仍保留在內存中 — 有關其成員和當前狀態的所有信息仍處於活動狀態。 因此,用戶在 Activity 內所做的任何更改都會得到保留,這樣一來,當 Activity 返回前臺(當它“繼續”)時,這些更改仍然存在。

     不過,當系統爲了恢復內存而銷燬某項 Activity 時,Activity 對象也會被銷燬,因此係統在繼續 Activity 時根本無法讓其狀態保持完好,而是必須在用戶返回 Activity 時重建 Activity 對象。但用戶並不知道系統銷燬 Activity 後又對其進行了重建,因此他們很可能認爲 Activity 狀態毫無變化。 在這種情況下,您可以實現另一個回調方法對有關 Activity 狀態的信息進行保存,以確保有關 Activity 狀態的重要信息得到保留:onSaveInstanceState()。

     系統會先調用 onSaveInstanceState(),然後再使 Activity 變得易於銷燬。系統會向該方法傳遞一個 Bundle,您可以在其中使用 putString() 和 putInt() 等方法以名稱-值對形式保存有關 Activity 狀態的信息。然後,如果系統終止您的應用進程,並且用戶返回您的 Activity,則系統會重建該 Activity,並將 Bundle 同時傳遞給 onCreate() 和 onRestoreInstanceState()。您可以使用上述任一方法從 Bundle 提取您保存的狀態並恢復該 Activity 狀態。如果沒有狀態信息需要恢復,則傳遞給您的 Bundle 是空值(如果是首次創建該 Activity,就會出現這種情況)。


這裏寫圖片描述

     在途中的兩種情況下,Activity 重獲用戶焦點時可保持狀態完好:系統在銷燬 Activity 後重建 Activity,Activity 必須恢復之前保存的狀態;系統停止 Activity 後繼續執行 Activity,並且 Activity 狀態保持完好。

Activity之間的切換時生命週期的變化

     當一個 Activity 啓動另一個 Activity 時,它們都會發生生命週期轉變。第一個 Activity 暫停並停止(但如果它在後臺仍然可見,則不會停止)時,同時系統會創建另一個 Activity。 如果這些 Activity 共用保存到磁盤或其他地方的數據,必須瞭解的是,在創建第二個 Activity 前,第一個 Activity 不會完全停止。更確切地說,啓動第二個 Activity 的過程與停止第一個 Activity 的過程存在重疊。

     生命週期回調的順序經過明確定義,當兩個 Activity 位於同一進程,並且由一個 Activity 啓動另一個 Activity 時,其定義尤其明確。 以下是當 Activity A 啓動 Activity B 時一系列操作的發生順序:

  1. Activity A 的 onPause() 方法執行。
  2. Activity B 的 onCreate()、onStart() 和 onResume() 方法依次執行。(Activity B 現在具有用戶焦點。)
  3. 然後,如果 Activity A 在屏幕上不再可見,則其 onStop() 方法執行。

     您可以利用這種可預測的生命週期回調順序管理從一個 Activity 到另一個 Activity 的信息轉變。 例如,如果您必須在第一個 Activity 停止時向數據庫寫入數據,以便下一個 Activity 能夠讀取該數據,則應在 onPause() 而不是 onStop() 執行期間向數據庫寫入數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章