Activity生命週期中我們可以做些什麼?

一個Acitivity是一個應用的程序組件,提供一個屏幕,用戶可以用來交互完成某些任務.

一個應用通常由多個Activity組成.

那麼在交互的過程中,必然會存在交互的各種狀態,那麼這些狀態在整個Activity中我們應該如何控制,以及在這個過程中我們可以做些什麼,在哪裏做呢?


Activity的生命週期可以按官方所提供這張圖來理解



接下來我直接在代碼中記錄和整理可以在Activity生命週期中我們可以做些什麼.


<span style="font-size:18px;">public class MainActivity extends AppCompatActivity {

    //Activity被創建時調用
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /**
         * 1,Activity一被創建便會執行onCreate方法創建,僅會在第一次創建時調用
         *
         * 2,如果在onSaveInstanceState()方法中曾記錄過Activity的狀態,savedInstanceState中會保存以前的狀態.
         *
         * 3,之後執行onStart()方法;
         *
         * 此方法是做所有初始化設置的地方,創建視圖,綁定數據等.
         */
    }

    //Activity由不可見變爲可見時調用
    @Override
    protected void onStart() {
        super.onStart();
        /**
         * 1,隨着程序是否爲用戶可見被多次調用
         *
         * 2,從onStart到onStop 爲整個Activity的可視生命週期,
         *
         * 3,之後執行onResume()方法;
         *
         * 可以在此進行註冊BroadcastReceiver來監控影響UI的改變.或加載一些資源等.
         */
    }

    //Activity可見時就會被調用
    @Override
    protected void onResume() {
        super.onResume();
        /**
         * 1,此時我們獲得焦點可與用戶進行交互
         *
         * 2,前臺的生命週期自onResume()直到onPause()爲止.在此期間Activity總是可見的.
         *
         * 3,此時的Activity一定是位於棧頂的.並接受用戶的輸入.
         *
         * 4,Activity會經常在暫停與恢復之間進行狀態轉換.
         *
         * 之後總會執行onPause()方法;
         */
    }

    //Activity可見不可操作時被調用
    @Override
    protected void onPause() {
        super.onPause();
        /**
         * 1,當Activity準備去啓動另一個Activity時.
         *
         * 2,可以在此方法中將未保存的數據進行持久化,或釋放掉一些消耗CPU的資源(比如動畫)
         *
         * 3,此方法中執行速度一定要快,下一個活動會等待此方法執行完纔會執行.
         *
         * 當Activity回到前臺執行onResume();
         * 當Activity變爲不可見時執行onStop();
         */
    }

    //Activity完全不可見時被調用
    //退出當前Activity或者跳轉到新Activity時被調用
    @Override
    protected void onStop() {
        super.onStop();

        /**
         * 1,停滯狀態,此時Activity完全不可見,從可見到完全不可見之時被調用
         *
         * 2,從onStart到onStop 爲整個Activity的可視生命週期,隨着程序是否爲用戶可見被多次調用
         *
         * 3,如果我們在onStart中註冊了BroadcastReceiver,可在此方法中進行取消註冊.或釋放一些資源.
         *
         * 4,從而保證停滯的Activity佔用更少的內存
         *
         * 如果再次回到前臺與用戶進行交互則執行onRestart()方法.
         * 如果關閉銷燬Activity則執行onDestroy()方法;
         */
    }

    //Activity從後臺重新回到前臺時被調用
    @Override
    protected void onRestart() {
        super.onRestart();
        /**
         * 重新開始
         * 此時Activity由完全不可見變爲可見之前會被調用(onStop-onRestart-onStart之間被調用)
         * 在Activity停止後,在再次啓動之前被調用
         *
         * 之後總會執行onStart()方法;
         */
    }

    //退出當前Activity時被調用,調用之後Activity就結束了
    @Override
    protected void onDestroy() {
        super.onDestroy();
        /**
         * 1,銷燬Activity之前會被調用
         *
         * 2,可以在此方法中進行資源的釋放以節省內存等.
         *
         * 可以使用isFinishing()方法區分Activity是被系統銷燬或Activity正常結束.
         */
    }

    //Activity窗口獲得或失去焦點時被調用
    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        /**
         * 1,在可否與用戶交互之間調用
         *
         * 2,可在此方法中獲取視圖組件的尺寸大小.
         *
         * 3,總是在onResume之後或onPause之後被調用
         */
    }

    /**
     * Activity被系統殺死時被調用.
     */
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        /**
         *  例如:
         *  1,屏幕方向改變時,Activity被銷燬再重建;
         *  2,當前Activity處於後臺,系統資源緊張將其殺死.
         *  3,另外,當跳轉到其他Activity或者按Home鍵回到主屏時該方法也會被調用,系統是爲了保存當前View組件的狀態.
         *  4,在onStop之前被調用也可能在onPause()之前.
         *  tip: 官方文檔爲it does so before onStop() and possibly before onPause()..
         *<span style="white-space:pre">	</span>
         *  通常在此方法中保存Activity的一些臨時狀態.
         */
    }

    /**
     * Activity被系統殺死後再重建時被調用.
     */
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        /**
         * 例如:
         * 1,屏幕方向改變時,Activity被銷燬再重建之時;
         * 2,當前Activity處於後臺,系統資源緊張將其殺死,用戶又啓動該Activity.
         * 3,這兩種情況下onRestoreInstanceState都會被調用,在onStart之後.
         *
         * 在此方法中我們可以進行一些數據的恢復.
         */
    }
}</span>


簡單總結一下


一個完整的Activity生命週期,從第一次調用onCreate()開始直到調用onDestroy()爲止.


因爲方法比較多那麼我們可以進行最基本的分類


一,Activity的可見的生命週期

onStart()-onResume()-onPause()-onStop();


1,可與用戶交互狀態 

onResume();

2,不可與用戶交互狀態(可以看見但不能進行操作,比如被另一個透明的Activity所覆蓋)

onPause();


二,Activity處於用戶不可見的狀態


 onStop(); 處在不可見狀態的Activity處於停滯狀態.


Activity中還有更爲細節的方法以及在這些方法中我們可以做些什麼操作,個人認爲更多的用法需要結合實際的需求與需要,並不是全部都用上就萬無一失的,何時用,怎麼用更是需要在長期使用中切身體會的.更多的是體會google如此設計的初衷以及學習其思考方式.


學習參考自:

基礎總結篇之一:Activity生命週期

Google官方文檔(需翻牆)

感謝大牛的文章,學習到很多東西,個人能力有限,僅按個人學習的過程中做一些心得體會.

關於在onCreate()方法中獲取Activity保存的狀態還是在onRestoreInstanceState()方法中獲取的區別可以學習Android開發之InstanceState詳解這篇文章.




發佈了32 篇原創文章 · 獲贊 6 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章