1. 程式人生 > >給學android的同學們的一些建議【III】

給學android的同學們的一些建議【III】

如有想學好android的可以加我QQ779939387

                 --詳解 Android 的 Activity 元件(上 )

在上兩篇幅中,對要學android的同學做了一些Java基礎說明的鋪墊,以及一些基礎行業概念的鋪墊,今天這篇想和大家探討和分享下關於學習android知識體系的一些建議。其實學習android和學習其他程式語言是無異的。這一篇幅中,我們來詳解一下一開始就會接觸的一個控制元件Activity。先分下面三個部分來述說:
第一部分:關於Activity的狀態
Android的設計架構者,借鑑了Java很多的一些設計特色,和 J2ME 的 MIDlet 一樣,在 android 中,Activity 的生命週期交給系統統一管理。與 MIDlet 不同的是安裝在 android 中的所有的 Activity 都是平等的。
 在 android 中,Activity 擁有四種基本狀態:

  1. Active/Runing        一個新 Activity 啟動入棧後,它在螢幕最前端,處於棧的最頂端,此時它處於可見並可和使用者互動的啟用狀態。
  2. Paused                    當 Activity 被另一個透明或者 Dialog 樣式的 Activity 覆蓋時的狀態。此時它依然與視窗管理器保持連線,系統繼續維護其內部狀態,所以它仍然可見,但它已經失去了焦點故不可與使用者互動。
  3. Stoped                    當 Activity 被另外一個 Activity 覆蓋、失去焦點並不可見時處於 Stoped狀態。
  4. Killed                       Activity 被系統殺死回收或者沒有被啟動時處於 Killed狀態。

當一個 Activity 例項被Create、Destory或者Start另外一個 Activity 時,其將在這四種狀態之間進行轉換,這種轉換的發生根據使用者的程式操作。下圖說明了 Activity 在不同狀態間轉換的具體情形:

如上所示,Android 程式設計師可以決定一個 Activity 的“生”,但不能決定它的“死”,也就時說程式設計師可以啟動一個 Activity,但是卻不能手動的“結束”一個 Activity。即使你呼叫 Activity.finish()方法時,結果和使用者按下 BACK 鍵一樣:告訴 Activity Manager 該 Activity 例項完成了相應的工作,可以被“回收”。其實這一點,學過Java的同學其實都可以發現,其回收機制和JVM的很類似的。【PS:也難怪現在每年Oracle公司總是要來一次起訴下Google了】。隨後 Activity Manager 啟用處於棧第二層的 Activity 並重新入棧,同時原 Activity 被壓入到棧的第二層,從 Active 狀態轉到 Paused 狀態。例如:從 ActivityA 中啟動了 ActivityB,則當前處於棧頂端的是 Activity2,第二層是 ActivityA,當我們呼叫 ActivityB.finish()方法時,Activity Manager 重新啟用 ActivityA 併入棧,ActivityB 從 Active 狀態轉換 Stoped 狀態,ActivityA. onActivityResult(int requestCode, int resultCode, Intent data)方法被執行,ActivityB 返回的資料通過 data引數返回給 ActivityA。 

 第二部分:關於Activity的記憶體棧的概念
 學過資料結構的同學,都聽說過棧的概念,而在第一部分講Activity的狀態生命週期時,我們也已經提到這個詞語“棧”,而Android 是通過一種 Activity 棧的方式來管理 Activity 的,一個 Activity 的例項的狀態決定它在棧中的位置。處於前臺的 Activity 總是在棧的頂端,當前臺的 Activity 因為異常或其它原因被銷燬時,處於棧第二層的 Activity 將被啟用,上浮到棧頂。當新的 Activity 啟動入棧時,原 Activity 會被壓入到棧的第二層。一個 Activity 在棧中的位置變化反映了它在不同狀態間的轉換。Activity 的狀態與它在棧中的位置關係如下圖所示:

如上所示,除了最頂層的 Activity 外,其它的 Activity 都有可能在系統記憶體不足時被回收,一個 Activity 的例項越是處在棧的底層,它被系統回收的可能性越大。系統負責管理棧中 Activity 的例項,它根據 Activity 所處的狀態來改變其在棧中的位置。其實在特別的時候,也有可能最頂層的Activity一樣可能被幹掉,根據作業系統的情況而言。 所以大家也要知道,為什麼我們在寫Activity的時候,要注意實時記得儲存下狀態資料,因為Activity被幹掉不是由我們來控制的。

 第三部分:關於Activity的生命週期
 在 android.app.Activity類中,Android 定義了一系列與生命週期相關的方法,在我們自己的 Activity 中,只是根據需要複寫需要的方法,Java 的多型性會保證我們自己的方法被虛擬機器呼叫,這一點與 J2ME 中的 MIDlet 類似。

public class OurActivity extends Activity { 
    protected void onCreate(Bundle savedInstanceState); 
    protected void onStart(); 
    protected void onResume();
    protected void onPause(); 
    protected void onStop(); 
    protected void onDestroy();
}

這些方法的說明如下:

  1. protected void onCreate(Bundle savedInstanceState) 一個 Activity 的例項被啟動時呼叫的第一個方法。一般情況下,我們都覆蓋該方法作為應用程式的一個入口點,在這裡做一些初始化資料、設定使用者介面等工作。大多數情況下,我們都要在這裡從 xml 中載入設計好的使用者介面。例如:setContentView(R.layout.main);當然,也可從 savedInstanceState中讀我們儲存到儲存裝置中的資料,但是需要判斷 savedInstanceState是否為 null,因為Activity 第一次啟動時並沒有資料被存貯在裝置中:

        if(savedInstanceState!=null){ 
            savedInstanceState.get("Key"); 
        }

  1. protected void onStart()該方法在 onCreate() 方法之後被呼叫,或者在 Activity 從 Stop 狀態轉換為 Active 狀態時被呼叫。
  2. protected void onResume()在 Activity 從 Pause 狀態轉換到 Active 狀態時被呼叫。 
  3. protected void onPause()在 Activity 從 Active 狀態轉換到 Pause 狀態時被呼叫。 
  4. protected void onStop()在 Activity 從 Active 狀態轉換到 Stop 狀態時被呼叫。一般我們在這裡儲存 Activity 的狀態資訊。
  5. protected void onDestroy()在 Active 被結束時呼叫,它是被結束時呼叫的最後一個方法,在這裡一般做些釋放資源,清理記憶體等工作。

此外,Android 還定義了一些不常用的與生命週期相關的方法可用: 

protected void onPostCreate(Bundle savedInstanceState); 
protected void onRestart();    如有想學好android的可以加我QQ779939387
protected void onPostResume();

Android 提供的文件詳細的說明了它們的呼叫規則。所以我們需要還要掌握一項技能:認真閱讀並能讀懂API文件。