格式化

廣告

廣告2

2013年3月12日 星期二

[Android SDK特色教學] Activity 的生命週期

[Android SDK特色教學] Activity 的生命週期

[Android SDK特色教學] Activity 的生命週期



以往在撰寫C++或JAVA程式時,進入點就是只有一個main(),不可能會有很多個也不可能一個都沒有。這點就跟android程式的觀念差很多,在android程式中並非有特定的程式進入點,而是依賴應用程式元件(Application Components)的觀念,利用各種元件運作在不同的執行階段來構建成一個完整的應用程式,也因此可以在不同時機或是不同需求下而啟動不同的元件。

Activity就是建立一個可以跟使用者互動的畫面,也就是看的見的「活動(Activity)」而這個畫面可以呈現各式各樣不同的UI元件,當然也可以有很多個Activity彼次互相跟使用者作互動。任何一個Activity畫面都會歷經7個階段的生命週期;並且由Activity stack所管理,當一個新的Activity被產生後,它將會被放置到stack的最頂端,並且呼叫「onCreate()」方法,而之前的Activity原則上還是存在stack中,但會進入「onPause()」方法的情況。

  • onCreate():當activity第一次被啟動時呼叫此時系統會建立activity的畫面(但還未顯示)。
  • onStart():讓activity能被使用者看見。
  • onResume():將activity移到堆疊的最上層,讓使用者可以和activity互動。
  • onPause():當有簡訊、電話等另外一個activity進行時,當前的activity就會進入onPause()的狀態,停止對螢幕的存取能力。所以應該在此階段釋放與當前activity有關的所有資源(例如:加速度感應器、陀螺儀、GPS等),以免消耗CPU、記憶體、電力等資源。
  • onStop():當使用者看不見當前activity的畫面時呼叫。如果這個activity無法透過返回鍵回覆,則進入onDestroy();如果當使用者返回此activity時,則進入onRestart()。
  • onRestart():重新啟動Stop狀態的activity。
  • onDestroy():當activity被銷毀時執行。銷毀的原因有幾種:activity不會再被使用、程式呼叫finish()、系統因記憶體不足而銷毀onStop()狀態下的activity。要確認activity是否被銷毀可使用 isFinishing() 方法。
 
不過在記憶體不足的時候,Android是會主動終止行程的,那它又是如何判斷哪個process是可以終止的呢?而最不重要的行程,最容易被終止,所以底下是由最重要到最不重要的排序如下:
  1. 前景行程(foreground process):使用者正在使用的行程,而且該行程正顯示在螢幕上,這種行程幾乎不可能被Android系統所終止,除非記憶體少的可憐,迫不得已才將它終止的。Activity的onCreate()、onStart()、onResume()方法呼叫時,該Activity就會變成前景行程。
  2. 可視行程(visible process):隨然不是前景行程,但是使用者還是看的到該行程的畫面,例如:dialog出現時,雖然該行程被dialog覆蓋,不過此時仍看的到該行程畫面。Activity的onPause()方法呼叫時,該Activity就會變成可視行程。
  3. 服務行程(service process):這是一個與Service綁定的行程,不屬於前兩項,雖然服務行程不被使用者所見,一般是在處理一些長時間的操作,已持續對使用者提供服務(例如MP3的播放或從網路下載資料)。系統會保護它不被終止,除非真的沒有記憶體可用了。
  4. 背景行程(background process ):特色是畫面既未顯示,對使用者也沒有直接影響,所以這種不可見的Activity被終止的確是安全的,系統維持著一個LRU列表,多個處於背景行程的Activity都在這裡面,系統可以根據LRU列表判斷哪些activity是可以被終止的,以及其中哪一個應該是最先被終止。Activity的onStop()方法呼叫時,該Activity就會變成背景行程。
  5. 空行程(empty process):這種是當背景行程被終止,會將其所占用的記憶體釋出,該行程便會從背景行程進入到空行程,但是Activity還存在!這樣的目的只有一個,就是為了在重新啟動「onRestart()」Activity時可以提高速度。這種是會最被優先終止的。因此建議,我們的背景操作,最好是設計成Service的形式,也就是說應該在Activity中啟動一個Service去執行這些操作。

將每一個Activity執行狀態連接在一起就是一個完整的Android應用程式流程。底下就是一些簡單的程式碼可以檢視呼叫不同方法的時機。

以下我們使用Log.e(String str, String str);來觀察各種不同情況下Android系統去會呼叫哪些方法來實作。

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  Log.e("TAG", "呼叫onCreate");
 }

 @Override
 protected void onStart() {
  super.onStart();
  Log.e("TAG", "呼叫onStart");
 }

 @Override
 protected void onRestart() {
  super.onRestart();
  Log.e("TAG", "呼叫onRestart");
 }

 @Override
 protected void onResume() {
  super.onResume();
  Log.e("TAG", "呼叫onResume");
 }

 @Override
 protected void onPause() {
  super.onPause();
  Log.e("TAG", "呼叫onPause");
 }

 @Override
 protected void onStop() {
  super.onStop();
  Log.e("TAG", "呼叫onStop");
 }

 @Override
 protected void onDestroy() {
  super.onDestroy();
  Log.e("TAG", "呼叫onDestroy");
 }
}


任何activity開啟之後都會必經的三個階段:onCreate()->onStart()->onResume()。雖然看起來似乎同時執行,那為什麼要特地分成三種狀態呢?其實要特別注意的是,因為onCreate()方法是在onStop()釋放資源後才呼叫;而onStart()方法是在onRestart()釋放資源後才呼叫;而onResume()方法是在onPause()釋放資源後才呼叫。

Activity啟動之後必經的三種階段onCreate()->onStart()->onResume()
Activity啟動之後必經的三種階段onCreate()->onStart()->onResume()

當你按下Home鍵跳回主畫面時Activity就會順序呼叫onPause()->onStop()
當你按下Home鍵跳回主畫面時Activity就會順序呼叫onPause()->onStop()

當你再度返回你背景執行的Activity時,就會順序呼叫onRestart()->onStart()->onResume()
當你再度返回你背景執行的Activity時,就會順序呼叫onRestart()->onStart()->onResume()

當使用者按下back鍵,就是確定要退出此Activity或是說確定可以銷毀此Activity了,就會順序呼叫onPause()->onStop()->onDestroy
當使用者按下back鍵,就是確定要退出此Activity或是說確定可以銷毀此Activity了,就會順序呼叫onPause()->onStop()->onDestroy


程式設計師必須很清楚自己設計的Activity在不同的階段,到底應該釋放多少資源,或是跟系統要求哪些資源。

沒有留言 :