淺談Android的Activity運行流程(生命週期)

關於Android的Activity運行流程,我們可以寫一些程序來直觀的查看Activity的運行流程。在這裏我們使用Log工具來獲取Activity運行日誌。假如我們新建一個Android項目,ProcessActivity.java代碼如下:

public class ProcessActivity extends Activity {

         private static final String tag="徐守威";

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        //setContentView(R.layout.main);

        Log.v(tag, "onCreate...");

    }

   

    @Override

    protected void onRestart() {

             // TODO Auto-generated method stub

             super.onRestart();

             Log.v(tag, "onRestart...");

    }

   

    @Override

    protected void onStart() {

             // TODO Auto-generated method stub

             super.onStart();

             Log.v(tag, "onStart...");

    }

   

    @Override

    protected void onResume() {

             // TODO Auto-generated method stub

             super.onResume();

             Log.v(tag, "onResume...");

    }

   

    @Override

    protected void onPause() {

             // TODO Auto-generated method stub

             super.onPause();

             Log.v(tag, "onPause...");

    }

   

    @Override

    protected void onStop() {

             // TODO Auto-generated method stub

             super.onStop();

             Log.v(tag, "onStop...");

    }

   

    @Override

    protected void onDestroy() {

             // TODO Auto-generated method stub

             super.onDestroy();

             Log.v(tag, "onDestroy...");

    }

}

我們爲Activity的哥哥狀態添加了“Log”記錄消息。當模擬器運行時,我們可以通過“LogCat”工具來查看Activity所處在的狀態。以上代碼中的七個狀態又可以歸納成三類:

1.資源分配(Create/Destory)

完整的Activity生命週期由“Create”狀態開始,由“Destory”狀態結束。創建(Create)時分配資源,銷燬(Destroy)時釋放資源。

2.可見與不可見(Start/ReStart/Stop)

當Activity運行到“Start”狀態時,就可以在屏幕上看到這個Activity。相反地,當Activity運行到“Stop”狀態時,這個Activity就會從屏幕上消失。

當Activity尚未被銷燬(Destory),而又再次被調用時,即會先進入“Restart”狀態後,再進入正常的“Start”狀態。例如我們從當前的Activity返回前一個Activity時候,將會比直接打開新Activity多進入一個“Rstart”狀態。

3.用戶能否直接訪問屏幕(Resume/Pause)

當有個“Toast”、“AlertDialog”、短信、電話等消息闖入時候,原來的Activity會進入“Pause”狀態,暫時放棄直接訪問屏幕的能力,被中斷到背景去,將前景交給優先級高的事件。當這些優先級高的時間處理完後,Activity就改進入“Resume”狀態,此時又直接訪問屏幕。

以上流程我們可以通過一個示意圖來加深理解:

 

由時機運行的記錄來看,我們可以歸納出所有Android應用程序都遵循的動作流程。

(1)一般啓動

Flow:onCreate -> onStart -> onResume

啓動一個Activity的基本流程是:分配資源給這個Activity(Create狀態),然後將Activity內容顯示到屏幕上(Start狀態)。在一切就緒後,取得屏幕的控制權(Resume狀態),用戶可以開始使用這個程序。

 

(2)調用另一個Activity

Flow:onPause(1) -> onCreate(2) -> onStart(2) -> onResume(2) -> onStop(1)

這是個縣凍結原本的Activity,再交出直接訪問屏幕能力(Pause狀態)的權利。知道Activity2完成一半啓動流程後,Activity1纔會被停止。

 

(3)返回原Activity

Flow:onPause(2) -> onRestart(1) -> onStart(1) -> onResume(1) -> onStop(2) -> onDestory(2)

在新的Activity中,點選硬件的“Back”按鈕,可以讓我們回到原本的Activity。

 

(4)退出結束

Flow: onPause -> onStop -> onDestory

如果程序中有直接調用“finishi”函數來關閉Activity的話,系統假設我們很確定我們在做什麼,因此會直接跳過先凍結(Freeze)的階段,暫停(Pause),停止(Stop),然後銷燬(Destory)。

 

(5)回收後再啓動

Flow: onCreate -> onStart -> onResume

被回收掉的Activity一旦重新被調用時,會像一般啓動一樣再次調用Activity的onCreate函數。

 

當我們使用Android手機一陣子,在手機上已經執行過多個應用程序。只要按下“Back”(返回)鍵,Android就會打開最近一次打開過的Activity。

這時候我們要是按下多次“Back”(返回)鍵,理論上遲早會返回到某個已經銷燬(Destory)的Activity,這時候會發生什麼事情呢??

如果應該打開的Activity已經被回收了,那麼這個Activity會再次被創建(Create)出來。再次被創建出來的Activity,當然會跟原本我們打開過的Activity不一樣。

所以如果要讓再次被創建出來的Activity看起來跟原本打開過的一樣,那麼在Activity之間切換時候,我們就要留意保留數據:最好在每次Activity運行到“onPalse”或“onStop”狀態時先保存數據,然後在“onCreate”時候將數據讀出來即可!


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