Activity的總結(一)

Activity是Android四大組件之一,簡單總結一下Activity組件。

一.Activity含義

Activity 是一個應用組件,用戶可與其提供的屏幕進行交互,以執行撥打電話、拍攝照片、發送電子郵件或查看地圖等操作。 每個 Activity 都會獲得一個用於繪製其用戶界面的窗口。窗口通常會充滿屏幕,但也可小於屏幕並浮動在其他窗口之上。

二.Activity的狀態

狀態 狀態說明
Active/Running(運行中) 此 Activity 位於屏幕前臺並具有用戶焦點。
Paused(暫停) 另一個 Activity 位於屏幕前臺並具有用戶焦點,但此 Activity 仍可見。(另一個 Activity 顯示在此 Activity 上方,並且該 Activity 部分透明或未覆蓋整個屏幕。)
Stopped(停止) 該 Activity 被另一個 Activity 完全遮蓋,它對用戶不再可見。
Killed(終止) 當Activity被系統回收掉。

三.Activity的創建和啓動

1.Activity的創建
在manifest中註冊Activity:
必須在清單文件中聲明,系統才能訪問這個Activity。

<activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

其中在”intent-filter”中加上

<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />

表明此Activitiy是主Activity,程序啓動先顯示此界面。
創建Activity:
必須創建 Activity 的子類(或使用其現有子類),需要在子類中實現 Activity 在其生命週期的各種狀態之間轉變時系統調用的回調方法。

public class MainActivity extends Activity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i(TAG, "onCreate: ");
    }
    ......
}

2.啓動Activity
Activity通過Intent來實現在應用程序的Activity間啓動、停止和傳輸。
以在MainActivity上啓動SecondActivity爲例:
(1).顯示啓動:

Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);

(2)隱式啓動:
在清單文件中設置intent-filter的action和category、data等:

<activity android:name=".SecondActivity">
            <intent-filter>
                <action android:name="action_to_secondActivity"/>
                <category android:name="android.intent.category.DEFAULT"/>/>
            </intent-filter>
        </activity>

跳轉時調用:

Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);

四.Activity生命週期

這裏寫圖片描述

方法 說明
onCreate() 首次創建 Activity 時調用,是生命週期的第一個方法,在生命週期中只執行一次,用於調用setContentView去加載界面佈局等初始化操作,始終後接onStart()。
onRestart() 在 Activity 已停止並即將再次啓動前調用。始終後接onStart()。
onStart() 在 Activity 即將對用戶可見之前調用。如果 Activity 轉入前臺,則後接 onResume(),如果 Activity 轉入隱藏狀態,則後接 onStop()。
onResume() 在 Activity 即將開始與用戶進行交互之前調用。 此時,Activity 處於 Activity 堆棧的頂層,並具有用戶輸入焦點。始終後接 onPause()。
onPause() 當系統即將開始繼續另一個 Activity 時調用。 此方法通常用於確認對持久性數據的未保存更改、停止動畫以及其他可能消耗 CPU 的內容,諸如此類。 它應該非常迅速地執行所需操作,因爲它返回後,下一個 Activity 才能繼續執行。如果 Activity 返回前臺,則後接 onResume(),如果 Activity 轉入對用戶不可見狀態,則後接 onStop()。
onStop() 在 Activity 對用戶不再可見時調用。如果 Activity 被銷燬,或另一個 Activity(一個現有 Activity 或新 Activity)繼續執行並將其覆蓋,就可能發生這種情況。如果 Activity 恢復與用戶的交互,則後接 onRestart(),如果 Activity 被銷燬,則後接 onDestroy()。
onDestroy() 在 Activity 被銷燬前調用。這是 Activity 將收到的最後調用。 當 Activity 結束(有人對 Activity 調用了 finish()),或系統爲節省空間而暫時銷燬該 Activity 實例時,可能會調用它。 您可以通過 isFinishing() 方法區分這兩種情形。

特別說明:
onPause()、onStop() 和 onDestroy()三種方法返回後可以終止進程。如果系統在緊急情況下必須恢復內存,可能不會調用 onStop() 和 onDestroy()。所以onPause()成爲結束進程前最後調用的方法。
因此使用 onPause() 向存儲設備寫入至關重要的持久性數據。

五.幾種情況下生命週期方法調用

1.啓動Activity:
這裏寫圖片描述
onCreate()->onStart()->onResume();
2.按back鍵返回到主屏:
這裏寫圖片描述
onPause()->onStop()->onDestroy();
3.當前Activity創建完成後,按Home鍵回到主屏:
這裏寫圖片描述
onPause()->onStop();
4.點擊Home鍵回到主界面後:
這裏寫圖片描述
onRestart()->onStart()->onResume();
5.從當前Activity跳轉到新的Activity:
這裏寫圖片描述
原Activity的onPause()->新Activity的onCreate()->新Activity的onStart()->新Activity的onResume()->原Activity的onStop();
此時如果新Activity設置爲透明主題(
android:theme=”@android:style/Theme.Translucent” )則日誌爲:
這裏寫圖片描述
最後原Activity的onStop()不會執行。
6.在新Activity頁面點擊Back鍵返回到原來Activity時:
這裏寫圖片描述
新Activity的onPause()->原Activity的onRestart()->原Activity的onStart()->原Activity的onResume()->新Activity的onStop()->新Activity的onDestroy();
當新Activity設置爲透明主題,日誌爲:
這裏寫圖片描述
由於5時不執行onStop(),故此時不會執行onRestart()和onStart()。

六.Activity的onSaveInstanceState和onRestoreInstanceState方法

onSaveInstanceState和onRestoreInstanceState方法不是生命週期中的方法,不一定被觸發。
onSaveInstanceState方法:當應用遇到意外情況(如:內存不足、用戶直接按Home鍵)由系統銷燬一個Activity時,onSaveInstanceState() 會被調用。一般在onStop方法之前。
onRestoreInstanceState方法:只有在Activity真的被系統非正常殺死過,恢復顯示Activity的時候,會調用onRestoreInstanceState。一般在onResume方法之前。
說明:通常onSaveInstanceState()只適合用於保存一些臨時性的狀態,而onPause()適合用於數據的持久化保存。

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