Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android成長之路(3)——Activity的生命周期(1)

Android成長之路(3)——Activity的生命周期(1)

編輯:關於Android編程

當用戶在用一個App的時候,Activity會在生命周期不同的狀態下轉換。

當用戶離開或重新回到一個Activity,我們可以在生命周期的回調函數中來寫一些相關的操作。比如,如果用戶打開了一個視頻播放器,當他直接切換到另外一個App,這時候應該使播放器暫停,斷開獲取視頻資源的網絡連接。當用戶回來,我們要重新連接網絡獲取視頻資源,讓用戶在剛才暫停的位置開始重新觀看。

接下來,開始去了解非常重要的生命周期的回調函數,學著怎麼去用它們來執行一些使用戶有更好體驗的操作,並且當我們不需要它們時,不要消耗系統的資源。在Android系統中,不是跟其他程序一樣會啟動一個main()方法, 而是通過調用對應生命周期特定狀態的回調函數,來開始一個Activity實例.

啟動一個Activity

在一個Activity的生命周期中,其中的回調函數可以看成一個階梯金字塔。也就是,每一個Activity生命周期的階段就是金字塔上的一個台階。當系統開始啟動一個Activity時,其中的回調函數會讓Activity一個台階一個台階地登上最高的那一台階。在最高的那一層台階,運行時Activity可以完全顯示出來,和用戶進行交互。

當用戶退出當前的Activity,系統會調用其它的方法,讓Activity從最高那層台階往下走,它就不會在前台了。有些時候,它只是從金字塔往下走了一部分,然後在那等著(比如說用戶切換到其它的App)。這個時候這個Activity還是可以往上走回到金字塔最高那一層(用戶又回到了之前的Activity),用戶繼續在剛才離開的地方進行操作。

這裡寫圖片描述vcbky/y1xEFwcKOssrvSqs/6u9m1scewtcRBcHA8YnIgLz4NCjKhorWx08O7p8O709DTw7W9z7XNs7XE18rUtKOs0qq52LX0o6yyu9Kqz/u6xM+1zbPXytS0PGJyIC8+DQozoaK1sdPDu6fA67+qQXBw0ru74brz1Nm1vUFwcKOssrvSqraqyqfTw7untcS9+LbIPGJyIC8+DQo0oaK1scbBxLvU2rrhz/K6zdfdz/LWrrzk0P3Xqsqxo6yyu9KqyqfIpdPDu6e1xL34tsihozwvcD4NCjxwPkFjdGl2aXR51Nqyu82stcS917bO16q7u8qxo6zI58nPzbyhozxiciAvPg0KtavKx6Os1rvT0Mj9uPa917bOyse+ssystcSho0FjdGl2aXR51ru74dTa1eLI/bj2vde2zsbk1tDSu7j2vde2zsnPs6TKsbzkzaPB9KO6PC9wPg0KPHA+PHN0cm9uZz5SZXN1bWVkPC9zdHJvbmc+PGJyIC8+DQrU2tXi0ru917bOo6xBY3Rpdml0ebvhz9TKvtTax7DMqMnPo6y6zdPDu6e9+NDQvbu7paGj0rK+zcrH1MvQ0LXEvde2zqGjPGJyIC8+DQo8c3Ryb25nPlBhdXNlZDwvc3Ryb25nPjxiciAvPg0K1NrV4rj2vde2zqOsQWN0aXZpdHm74bG7xuTL+7XEQWN0aXZpdHmyv7fWtdjV2rjH16GjrNXiyrG68rXEQWN0aXZpdHmyu8TcvdPK1dPDu6e1xMrkyOvSsrK7xNzWtNDQyM66zrT6wuuhozxiciAvPg0KPHN0cm9uZz5TdG9wcGVkPC9zdHJvbmc+PGJyIC8+DQq1sUFjdGl2aXR51NpTdG9wcGVkvde2zqOsu+HN6sirsbvR2rjH16GjrNPDu6eyu7/JvPuho9Xiyse1xEFjdGl2aXR5yrXA/brNy/u1xNK70KmzydSxseTBv8jUyLuxo8H0o6y1q8v8sru74da00NDIzrrOtPrC68HLoaM8L3A+DQo8cD62+NTaxuTL+7XEvde2ziAoQ3JlYXRlZCC6zSBTdGFydGVkKSC2vMrH0rvLsrzktcSjrCDPtc2zu+G199PDz8LSu7j2yfrD/Nbcxtq1xLqvyv2jrLrcv+y12Mz4tb3PwtK7uPa917bOoaPL+dLU1NrPtc2ztffTwyBvbkNyZWF0ZSgp1q6686Osy/y63L/svs274bX308NvblN0YXJ0KKOpvdPXxcLtyc+4+tfFIG9uUmVzdW1lKCmhozwvcD4NCjxwPjxzdHJvbmc+1ri2qEFwcLXExvS2r0FjdGl2aXR5PC9zdHJvbmc+PC9wPg0KPHA+1NpBbmRyb2lkTWFuaWZlc3QueG1s1tCjrL/J0tTWuLaoxMTSu7j2QWN0aXZpdHnTw9f3bWFpbiBBY3Rpdml0eaGj1eK49m1haW4gQWN0aXZpdHnSqtTaJmx0OyBpbnRlbnQtZmlsdGVyICZndDvW0Mn5w/ejrLD8uqxNQUlOIGFjdGlvbiC6zSBMQVVOQ0hFUiBjYXRlZ29yeS48YnIgLz4NCsD9yOc6PC9wPg0KPHByZSBjbGFzcz0="brush:java;">

OnCreate

大部分的App都會有幾個不同的Activity,當用戶點擊打開App時,系統會通過調用onCreate()方法來創建每個新的Activity。
必須要實現 onCreate()方法來執行一些活動的UI、數據等加載,這在整個生命周期只執行一次。例如在XML中定義用戶界面口,定義成員變量,配置一些UI。

上一次DisplayActivity中的代碼:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_display_message);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        Intent intent = getIntent();
        String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
        TextView textView = new TextView(this);
        textView.setTextSize(40);
        textView.setText(message);

        RelativeLayout layout = (RelativeLayout) findViewById(R.id.content);
        layout.addView(textView);

    }

一旦 onCreate()執行完成, 系統就會緊接著調用 onStart() 和 onResume() 方法. Activity不會停留在Created和Started這兩個階段。其實,當onStart()方法被調用的時候,用戶已經可以看見Activity,只不過onResume()會馬上被調用,Activity就進入在Resumed這一狀態,直到用戶切換到另一個App或者有來電了,又或者關閉了屏幕。

這裡寫圖片描述

當創建一個新的Activity實例時,重點關注這三個回調方法 :onCreate(), onStart(), 和 onResume()。一旦回調方法執行完成,Activity就會到Resumed這一階段,即Activity回到前台,用戶就可以和這個Activity進行交互。

onDestroy

onCreate()在生命周期中是第一個執行的方法,而onDestroy()是生命周期中最後一個執行的方法. 系統在Activity中調用onDestroy()這個方法作為結束的信號,Activity實例會從系統內存中移除。

大部分App都不需要實現這個方法,因為Activity調用onDestroy()前,應該在onPause() 和onStop()這兩個方法中執行清除內存操作。但是如果Activity中有線程是在onCreate()中或者一些長期運行的資源,如果不合適地關掉的話,會造成內存洩漏!這是時候應該在最後的onDestroy()方法中關掉它們。

@Override
public void onDestroy() {
    super.onDestroy(); 
}

系統在調用onPause()和onStop()方法之後,就會調用onDestroy()用。
除了一種情況:就是在onCreate()中調用finish()方法。
有時候,比如Activity執行一個臨時的決策來啟動另一Activity,就會在onCreate()中調用finish()方法。這種情況,系統會馬上調用onDestroy()方法,不會再經過生命周期的其他回調方法。

OnPause()和onResume()

在用戶使用app時,前台Activity有時被其他組件遮住,會導致Activity暫停。例如,當一個提示對話框打開,Activity就會暫停。雖然仍可以看見部分的Activity,但是Activity已經暫停,不會執行任何操作。如果Activity一旦完全被遮蓋著看不見,它就停止了。會進入Stopped這一狀態。

當Activity進入Paused狀態,系統會在Activity中調用onPause(),比如會暫停視頻,或者暫時保存 一些信息。當用戶從Paused狀態返回到當前的Activity,系統就會調用onResume()方法,重新回到Resumed狀態。
這裡寫圖片描述

當系統調用onPause(),Activity部分可見。但大多數的情況是,用戶會離開當前的Activity,就會進入Stopped狀態,最後執行onDestroy()方法。所以呢,在onPause()中會做一下幾點:

1、停止會消耗CPU的動畫或者正在運行的操作。
2、提交未保存的修改,比如草稿郵件/3、釋放系統資源,比如廣播接收器,GPS,或者當Activity暫停,而用戶又不需要用到的資源

例如,App用到相機,那麼onPause()方法是一個非常合適的地方來釋放它

@Override
public void onPause() {
    super.onPause();  //首先調用父類的方法

    // 釋放資源,因為其他的Activity可能需要用到它
    if (mCamera != null) {
        mCamera.release();
        mCamera = null;
    }
}

注意,不要在onPause()方法中執行數據庫的操作,因為這會使跳轉到下一個Activity很緩慢。
在onPause()執行一些相對簡單的操作,以致於可以快速地跳轉到下一個Activity。當Activity停止,這時候Activity實例會放在內存中,當Activity恢復時,就會重新調用這個實例,不需要再重新創建一個Activity實例。

需要知道的是,每一次系統調用onResume()方法,Activity就會回到前台,其中也包括了第一次創建實例的時候。

應該在onResume()方法中初始化一些在onPause()被釋放掉的組件,還有每次恢復所需要的組件,比如一些開始的動畫和需要的組件。

以下onResume()對應上面onPause()的例子,初始化在Pasued狀態被釋放掉的相機。

@Override
public void onResume() {
    super.onResume();  

    if (mCamera == null) {
        initializeCamera(); // 初始化相機的操作
    }
}
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved