Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Activity最強生命周期

Activity最強生命周期

編輯:關於Android編程

寫在前面:
Googl官方的Android開發文檔關於生命周期的描述給出了這麼一張圖片:
Activity生命周期
我對這張圖片的解讀是這樣的:
Activity 類中定義的七個回調方法,覆蓋了活動生命周期的每一個環節,下面我來一一
介紹下這七個方法。
1. onCreate()
這個方法你已經看到過很多次了,每個活動中我們都重寫了這個方法,它會在活動
第一次被創建的時候調用。你應該在這個方法中完成活動的初始化操作,比如說加載布局、綁定事件等。
2. onStart()
這個方法在活動由不可見變為可見的時候調用
3. onResume()
這個方法在活動准備好和用戶進行交互的時候調用。此時的活動一定位於返回棧的
棧頂,並且處於運行狀態。
4. onPause()
這個方法在系統准備去啟動或者恢復另一個活動的時候調用。 我們通常會在這個方
法中將一些消耗 CPU 的資源釋放掉,以及保存一些關鍵數據,但這個方法的執行速度
一定要快,不然會影響到新的棧頂活動的使用。
5. onStop()
這個方法在活動完全不可見的時候調用。它和 onPause()方法的主要區別在於,如
果啟動的新活動是一個對話框式的活動,那麼 onPause()方法會得到執行,而 onStop()
方法並不會執行。
6. onDestroy()
這個方法在活動被銷毀之前調用,之後活動的狀態將變為銷毀狀態。
7. onRestart()
這個方法在活動由停止狀態變為運行狀態之前調用,也就是活動被重新啟動了。
以上七個方法中除了 onRestart()方法, 其他都是兩兩相對的,從而又可以將活動分為三種生存期。
1. 完整生存期
活動在 onCreate()方法和 onDestroy()方法之間所經歷的,就是完整生存期。一般情
況下,一個活動會在 onCreate()方法中完成各種初始化操作,而在 onDestroy()方法中完
成釋放內存的操作。
2. 可見生存期
活動在 onStart()方法和 onStop()方法之間所經歷的,就是可見生存期。在可見生存
期內,活動對於用戶總是可見的,即便有可能無法和用戶進行交互。我們可以通過這兩
個方法,合理地管理那些對用戶可見的資源。比如在 onStart()方法中對資源進行加載,
而在 onStop()方法中對資源進行釋放,從而保證處於停止狀態的活動不會占用過多內存。
3. 前台生存期
活動在 onResume()方法和 onPause()方法之間所經歷的,就是前台生存期。在前台
生存期內,活動總是處於運行狀態的,此時的活動是可以和用戶進行相互的,我們平時
看到和接觸最多的也這個狀態下的活動。

1,單個Activity生命周期

一言不合直接上代碼:

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onStart() {
        super.onStart();

        System.out.println("one onStart");
    }

    @Override
    protected void onStop() {
        super.onStop();

        System.out.println("one onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        System.out.println("one onDestroy");
    }

    @Override
    protected void onPause() {
        super.onPause();

        System.out.println("one onPause");
    }

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

        System.out.println("one onResume");
    }

    @Override
    protected void onRestart() {
        super.onRestart();

        System.out.println("one onReStart");
    }
}

這裡我直接重寫了MainActivity的7個方法,這裡簡單起見,我給每個方法打印了一句話,每當Activity執行都某個方法時,打印出該方法的名字。
剛打開Activity打印是這樣的:
這裡寫圖片描述
一個Activity的創建,沒什麼可說的

點擊home鍵回到桌面打印是這樣的:
這裡寫圖片描述
因為Activity已經變為不可見,所以執行這兩個方法;又因為我並沒有直接退出Activity,所以沒有執行onDestroy方法

再次點擊進入Activity:
這裡寫圖片描述
這裡我們不是重新創建一個Activity,所以不執行onCreate

點擊返回鍵退回桌面:
這裡寫圖片描述
Activity被銷毀,執行onDestroy

2、在Activity跳轉過程的生命周期

與第一種情況相比代碼稍有改動;一臉懵逼,上代碼:


給MainActivity增加一個Button用於跳轉到ActivityTwo:

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = (Button) findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i =  new Intent(MainActivity.this,ActivityTwo.class);
                startActivity(i);
            }
        });

        System.out.println("one onCreate");
    }

ActivityTwo代碼

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class ActivityTwo extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_two);
    }

    @Override
    protected void onStart() {
        super.onStart();

        System.out.println("two onStart");
    }

    @Override
    protected void onStop() {
        super.onStop();

        System.out.println("two onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        System.out.println("two onDestroy");
    }

    @Override
    protected void onPause() {
        super.onPause();

        System.out.println("two onPause");
    }

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

        System.out.println("two onResume");
    }

    @Override
    protected void onRestart() {
        super.onRestart();

        System.out.println("two onReStart");
    }
}

點擊按鈕,打印如下:
這裡寫圖片描述
這裡寫圖片描述
啟動一個全屏顯示的ActivityTwo,前面的MainActivity肯定是要Stopped,但是這個調用的順序一定要注意。它是先onPause,然後等ActivityTwo執行完onResume方法後,再執行onStop方法。這也是為什麼強調在onPause方法裡面,我們只能去執行一些輕量級的代碼。

現在ActivityTwo處於前台,並且用戶可見,現在點擊返回按鈕,打印如下:
這裡寫圖片描述
這裡寫圖片描述
按下返回按鈕,等於finish掉了ActivityTwo,看它的執行過程,也是先暫停自身,然後再去重啟MainActivity,等MainActivity重啟完畢後,再調用onStop和onDestory方法。

3、啟動對話框樣式的ActivityTwo

在Androidmanifest文件把ActivityTwo設置為對話框樣式的Activity:

 

點擊按鈕,啟動對話框式的ActivityTwo:
這裡寫圖片描述
啟動ActivityTwo後,MainActivity還可見,只是不可與用戶交互;所以不執行onStop方法

現在ActivitTwoy處於前台,而且可以與用戶交互,現在點擊返回按鈕,打印如下:
這裡寫圖片描述
這裡寫圖片描述
可以看到MainActivity調用的是onResume方法

四、回調方法應該干些甚麼
回調方法的作用,就是通知我們Activity生命周期的改變,然後我們可以處理這種改變,以便程序不會崩潰或者數據丟失等等,也就是擁有更好的用戶體檢,那麼這麼多回調方法裡到底應該怎麼做呢?
這個問題不好總結,因為不同的應用、不同的Activity所干的事都不一樣,有時候我們甚至只需要實現一個onCreate就行了。所以下面所說的,看看即可,不一定符合所有的情況。
1、onCreate
最重要是在裡面調用setContentView,還可以在裡面初始化各控件、設置監聽、並初始化一些全局的變量。
因為在Activity的一次生命周期中,onCreate方法只會執行一次。在Paused和Stopped狀態下恢復或重啟的下,這些控件、監聽和全局變量也不會丟失。即便是內存不足,被回收了,再次Recreate的話,又是一次新的生命周期的開始,又會執行onCreate方法。

還可以在onCreate執行數據操作,比如從Cursor中檢索數據等等,但是如果你每次進入這個Activity都可能需要更新數據,那麼最好放在onStart裡面。(這個需要根據實際情況來確定)

2、onDestory
確定某些資源是否沒有被釋放,做一些最終的清理工作,比如在這個Activity的onCreate中開啟的某個線程,那麼就要在onDestory中確定它是否結束了,如果沒有,就結束它。

3、onStart和onRestart、onStop
Activity進入到Stopped狀態之後,它極有可能被系統所回收,在某些極端情況下,系統可能是直接殺死應用程序的進程,而不是調用onDestory方法,所以我們需要在onStop方法中盡可能的釋放那些用戶暫時不需要使用的資源,防止內存洩露。
盡管onPause在onStop之前執行,但是onPause只適合做一些輕量級的操作,更多的耗時耗資源的操作還是要放在onStop裡面,比如說對數據保存,需要用到的數據庫操作。

因為從Stopped狀態重啟之後, onStart和onRestart方法都會被執行,所以我們要判斷哪些操作分別要放在哪個方法裡面 。因為可能在onStop方法裡面釋放了一些資源,那麼我們必須要重啟他們,這個時候這些重啟的操作放在onStart方法裡面就比較好(因為onCreate之後也需要開啟這些資源)。那些因為Stopped之後引發的需要單獨操作的代碼,就可以放在onRestart裡面。

4、onResume和onPause
onPause和onResume中做的操作,其實意義上和onStart和inStop差不多,只不過是要更輕量級的,因為onPause不能阻塞轉變到下一個Activity。
比如:停止動畫、取消broadcast receivers。當然相應的需要在onResume中重啟或初始化等等。
有時候也需要在onPause判斷用戶是調用finish結束這個Activity,還是暫時離開,以便區分處理。這時候可以調用isFinishing()方法來判斷。如果是用戶finish這個Activity,那麼返回為true,如果只是暫時離開或者被系統回收的話,就返回false。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved