天天看點

【移動開發】Android中Activity剖析

    又到了暑假,大四的走了,我們理所當然成為了學校的老大,哈哈!今年不打算回家了,在學校和校友一起參加比賽做項目。好久就有寫部落格的沖動,但老是被各種事情所打擾,今天終于考完試了,于是在安靜的宿舍開始提筆寫起我的第一篇部落格。寫部落格的目的主要是:總結以下這一年多來接觸Android開發中所學到的知識,以此來督促自己不斷地前進學習(廢話比較多。。。此段可以忽略)

Activity 棧

   Android 是通過一種 Activity 棧的方式來管理 Activity 的,一個 Activity 的執行個體的狀态決定它在棧中的位置。處于前台的 Activity 總是在棧的頂端,目前台的 Activity 因為異常或其它原因被銷毀時,處于棧第二層的 Activity 将被激活,上浮到棧頂。

   當新的 Activity 啟動入棧時,原 Activity 會被壓入到棧的第二層。一個 Activity 在棧中的位置變化反映了它在不同狀态間的轉換。Activity 的狀态與它在棧中的位置關系如下圖所示:

Activity的生命周期

   首先看看android developers 網上的activity的生命周期圖:

   其實,當初我第一次開始看到此圖的時候,也是一頭霧水,于是就寫了一個Demo簡單測試一下,結果就清楚明了了:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

<code>package</code> <code>com.tutor.activitydemo;</code>

<code>import</code> <code>android.app.Activity;</code>

<code>import</code> <code>android.os.Bundle;</code>

<code>import</code> <code>android.util.Log;</code>

<code>public</code> <code>class</code> <code>ActivityDemo </code><code>extends</code> <code>Activity {</code>

<code>    </code><code>private</code> <code>static</code> <code>final</code> <code>String</code> <code>TAG = </code><code>"ActivityDemo"</code><code>;</code>

<code>    </code><code>public</code> <code>void</code> <code>onCreate(Bundle savedInstanceState) {</code>

<code>        </code><code>super</code><code>.onCreate(savedInstanceState);</code>

<code>        </code><code>setContentView(R.layout.main);</code>

<code>        </code><code>Log.e(TAG, </code><code>"---》onCreate()"</code><code>);</code>

<code>    </code><code>}</code>

<code>    </code><code>@Override</code>

<code>    </code><code>protected</code> <code>void</code> <code>onStart() {</code>

<code>        </code><code>super</code><code>.onStart();</code>

<code>        </code><code>Log.e(TAG, </code><code>"---》onStart()"</code><code>);</code>

<code>    </code><code>protected</code> <code>void</code> <code>onRestart() {</code>

<code>        </code><code>super</code><code>.onRestart();</code>

<code>        </code><code>Log.e(TAG, </code><code>"---》onRestart()"</code><code>);</code>

<code>    </code><code>protected</code> <code>void</code> <code>onResume() {</code>

<code>        </code><code>super</code><code>.onResume();</code>

<code>        </code><code>Log.e(TAG, </code><code>"---》onResume()"</code><code>);</code>

<code>    </code><code>protected</code> <code>void</code> <code>onPause() {</code>

<code>        </code><code>super</code><code>.onPause();</code>

<code>        </code><code>Log.e(TAG, </code><code>"---》onPause()"</code><code>);</code>

<code>    </code><code>protected</code> <code>void</code> <code>onStop() {</code>

<code>        </code><code>super</code><code>.onStop();</code>

<code>        </code><code>Log.e(TAG, </code><code>"---》onStop()"</code><code>);</code>

<code>    </code><code>protected</code> <code>void</code> <code>onDestroy() {</code>

<code>        </code><code>super</code><code>.onDestroy();</code>

<code>        </code><code>Log.e(TAG, </code><code>"---》onDestroy()"</code><code>);</code>

<code>}</code>

方法說明:

   1.protected void onCreate(Bundle savedInstanceState)一個 Activity 的執行個體被啟動時調用的第一個方法。一般情況下,我們都覆寫該方法作為應用程式的一個入口點,在這裡做一些初始化資料(加載使用者資料庫儲存資料,配置資訊)、設定使用者界面等工作。大多數情況下,我們都要在這裡從 xml 中加載設計好的使用者界面。

   2.protected void onStart()該方法在 onCreate() 方法之後被調用,或者在 Activity 從 Stop 狀态轉換為 Active 狀态時被調用。

   3.protected void onResume() 在 Activity 從 Pause 狀态轉換到 Active 狀态時被調用。

    4.protected void onResume()在 Activity 從 Active 狀态轉換到 Pause 狀态時被調用。

    5.protected void onStop()在 Activity 從 Active 狀态轉換到 Stop 狀态時被調用。一般我們在這裡儲存 Activity 的狀态資訊。

    6.protected void onDestroy()在 Active 被結束時調用,它是被結束時調用的最後一個方法,在這裡一般做些釋放資源,清理記憶體等工作。

列印結果分析:

 第一組

     1.打開應用後執行順序:onCreate()-&gt;onStart()-&gt;onResume()

     2.按Back鍵後結束這個應用:onPause()-&gt;onStop()-&gt;onDestory()

 第二組

    3.按Home鍵後:onPause()-&gt;onStop()這兩個方法,這時候應用程式并沒有銷毀;緊接着再次進入此程式會執行:onRestart()-&gt;onStart()-&gt;onResume()

   為了更好的了解Activity的生命周期,從網上找到此圖:

<a target="_blank" href="http://blog.51cto.com/attachment/201307/214802519.png"></a>

   從上圖可以看到,最右邊下方的Android機器人代表啟動一個Activity,經過一系列的操作和過程,經過三個生命周期回調方法,到達金字塔的頂層,爬到頂層就可以供使用者操作了。然後從金字塔頂往下,再經過三個生命周期方法,就又到了金字塔的另一邊底層,Activity就銷毀了。但是當下金字塔的時候,隻要沒到最下面,都有通道可以回到最頂層。

   1.Activity在onStart方法調用後,就處于可見狀态了(visible)

   2.當經過onPause方法後處于暫停狀态(Paused),這時Activity處于半透明狀态,為不可操作的,比如彈出一個模态框。這時Activity不會執行任何代碼

   3.Activity在調用onStop方法後即處于使用者不可見的狀态了(invisible)

   4.onCreate方法在整個生命周期隻會被調用一次

   5.自定義Activity繼承Activity類後有沒有需要必須實作的方法?答案是沒有,但是要想啟動和顯示一個Activity,就必須實作onCreate方法并指定布局檔案

   6.大部分的清理操作應該在onPause和onStop中執行,如果在onCreate中開啟了耗時線程或耗資源的線程操縱,應該在onDestroy中殺死線程

  注意:

   系統一般都是在執行完onPause和onStop方法後再執行onDestroy方法,但是當在onCreate方法中調用了Activity的finish()方法後,比如在onCreate方法裡啟動新的Activity并調用了finish方法,這時系統會直接調用onDestroy方法!

就這些吧,東西比較簡單,主要是為了練練部落格怎麼寫,嘿嘿!

<b>     本文轉自zhf651555765 51CTO部落格,原文連結:http://blog.51cto.com/smallwoniu/1246732</b><b>,如需轉載請自行聯系原作者</b>