程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> Android中的Activity生命周期詳解

Android中的Activity生命周期詳解

編輯:關於PHP編程

Android中的Activity生命周期詳解


軟硬件環境

  • Macbook Pro MGX 72
  • Android Studio 1.3.2
  • Genymotion模擬器

前言

在Android中,有四大開發組件,它們是Android編程的基礎,Activity更是首當其沖,是重中之重。今天我們就來好好學習下Activity的生命周期。

Activity是什麼?

Activity是Android開發中最重要一個組件,幾乎所有的交互操作都在Activity中進行,它主要負責創建窗口,在此窗口中你可以通過調用setContentView函數來將你需要的UI控件展現出來。先來看張Android API給出的一個activity生命周期圖,如果一開始沒看明白的,可以看完整篇博文再回頭來看,加深理解。

activity_01

幾個重要回調函數

以下的這些Activity方法展示了Activity的完整的生命周期,當Activity的狀態發生變化時,可以通過重寫這些方法來實現某些功能。

 public class Activity extends ApplicationContext {    protected void onCreate(Bundle savedInstanceState);    protected void onStart();    protected void onRestart();    protected void onResume();    protected void onPause();    protected void onStop();    protected void onDestroy();}

onCreate

當activity第一次被創建時調用。視圖的創建、數據的初始化都在這裡執行。眼尖的你可能已經發現,onCreate方法中有一個Bundle savedInstanceState參數,這裡面會保存activity之前的狀態,有很用。

onStart

會在onCreate方法後調用

onResume

會在onStart方法後調用。activity是使用棧結構來管理的,此時activity處於棧頂。

onRestart

被stop的activity重新啟動時調用此函數,後面會緊跟onResume。

onPause

當有新的activity進入棧頂,即當前activity被迫到後台運行,onPause就會被調用。

onStop

會在onPause方法後調用,此時activity對於用戶來講,已經是不可見的了(Invisible)。從棧的角度來說,就是有新的activity壓棧,或者已經存在的activity回到了棧頂。

onDestroy

這是生命周期中的最後一個函數。一般情況下activity已經完成(調用finish函數)或者系統為了回收資源主動銷毀activity時,onDestroy才會被調用,可以通過isFinishing()方法來區分這2種情況。

綜上,從onCreate開始到onDestroy結束,稱為activity的一個完整生命周期。這裡還有2個概念需要區別一下。

1. 可見的(Visible,從onStart到onStop,這裡的可見,不僅僅是在屏幕上可見)2. 前台運行(Foreground,從onResume到onPause)

為了弄明白這些回調函數在各種情況下的調用順序,我們新建個工程,名叫ActivityLifecycle,在這些回調函數中加些打印,如下

@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    editText = (EditText)findViewById(R.id.edittext);    Log.d(TAG,"=== onCreate ===");}@Overrideprotected void onStart() {    super.onStart();    Log.d(TAG,"=== onStart ===");}@Overrideprotected void onResume() {    super.onResume();    Log.d(TAG, "=== onResume ===");}@Overrideprotected void onPause() {    super.onPause();    Log.d(TAG, "=== onPause ===");}@Overrideprotected void onRestart() {    super.onRestart();    Log.d(TAG, "=== onRestart ===");}@Overrideprotected void onStop() {    super.onStop();    Log.d(TAG, "=== onStop ===");}@Overrideprotected void onDestroy() {    super.onDestroy();    Log.d(TAG, "=== onDestroy ===");}

運行一下程序,從Logcat中可以看到

activity_02

說明了一個Activity從創建到顯示出來需要執行onCreate-->onStart-->onResume三個方法。

在App運行期間,如果想去在打開其它App,一般我們會去按Home鍵退出,這時候的回調又是怎樣的呢?看下下圖

activity_03

執行了onPause-->onStop,說明Activity並沒有被銷毀,只是被別的Activity覆蓋了,被放到了後台去運行了,這種情形跟有突發事情發生(如有來電或者有App正在安裝)是一樣的,而當突發事件結束,Activity將會執行onRestart-->onStart-->onResume,整個過程打印如下圖

activity_06

App運行時,如果當前Activity是最後一個Activity時,當我們按下Back鍵時,程序就會結束。這時候會相繼執行onPause-->onStop-->onDestroy三個方法,如下圖

activity_04

接下來稍微修改下工程,加入第2個Activity,叫SecondActivity,通過點擊MainActivity上的一個按鈕進入到SecondActivity,這時如果按下Back鍵,SecondActivity將會執行onPause-->onStop-->onDestroy,而MainActivity將會執行onRestart-->onStart-->onResume,如下圖

activity_05

onSaveInstanceState與onRestoreInstanceState

這裡有個概念,上邊沒有講到。在onPause、onStop方法調用後,activity進程是有可能隨時被殺掉的,所以應該在onPause方法中進行數據保存操作,以免數據丟失。onSaveInstanceState方法也是完成類似的功能,數據保存在給定的bundle裡。因為onSaveInstanceState不是activity生命周期函數,android API更推薦在onPause方法中去保存數據。

橫豎屏切換

不做任何處理,切換下橫豎屏,看看打印,可以發現先是銷毀然後再重新創建了activity

activity_07

為了解決上述問題,一般會有幾個辦法

  • 禁止橫豎屏切換(限定橫屏或豎屏,比較流氓啊,不推薦)
  • 橫豎屏獨立布局(創建2個文件夾layout-land和layout-port,對應的xml文件不變)
  • 防止activity重載(在AndroidManifest.xml中添加android:configChanges="keyboardHidden|orientation",並重寫onConfigurationChanged方法)

源碼下載

http://download.csdn.net/detail/djstavav/9147793

參考文獻

1、http://developer.android.com/intl/zh-cn/reference/android/app/Activity.html
2、http://developer.android.com/guide/topics/manifest/activity-element.html
3、http://developer.android.com/guide/topics/resources/runtime-changes.html

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved