在Android中,有四大開發組件,它們是Android編程的基礎,Activity更是首當其沖,是重中之重。今天我們就來好好學習下Activity的生命周期。
Activity是Android開發中最重要一個組件,幾乎所有的交互操作都在Activity中進行,它主要負責創建窗口,在此窗口中你可以通過調用setContentView函數來將你需要的UI控件展現出來。先來看張Android API給出的一個activity生命周期圖,如果一開始沒看明白的,可以看完整篇博文再回頭來看,加深理解。
以下的這些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();}
當activity第一次被創建時調用。視圖的創建、數據的初始化都在這裡執行。眼尖的你可能已經發現,onCreate方法中有一個Bundle savedInstanceState參數,這裡面會保存activity之前的狀態,有很用。
會在onCreate方法後調用
會在onStart方法後調用。activity是使用棧結構來管理的,此時activity處於棧頂。
被stop的activity重新啟動時調用此函數,後面會緊跟onResume。
當有新的activity進入棧頂,即當前activity被迫到後台運行,onPause就會被調用。
會在onPause方法後調用,此時activity對於用戶來講,已經是不可見的了(Invisible)。從棧的角度來說,就是有新的activity壓棧,或者已經存在的activity回到了棧頂。
這是生命周期中的最後一個函數。一般情況下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從創建到顯示出來需要執行onCreate-->onStart-->onResume三個方法。
在App運行期間,如果想去在打開其它App,一般我們會去按Home鍵退出,這時候的回調又是怎樣的呢?看下下圖
執行了onPause-->onStop,說明Activity並沒有被銷毀,只是被別的Activity覆蓋了,被放到了後台去運行了,這種情形跟有突發事情發生(如有來電或者有App正在安裝)是一樣的,而當突發事件結束,Activity將會執行onRestart-->onStart-->onResume,整個過程打印如下圖
App運行時,如果當前Activity是最後一個Activity時,當我們按下Back鍵時,程序就會結束。這時候會相繼執行onPause-->onStop-->onDestroy三個方法,如下圖
接下來稍微修改下工程,加入第2個Activity,叫SecondActivity,通過點擊MainActivity上的一個按鈕進入到SecondActivity,這時如果按下Back鍵,SecondActivity將會執行onPause-->onStop-->onDestroy,而MainActivity將會執行onRestart-->onStart-->onResume,如下圖
這裡有個概念,上邊沒有講到。在onPause、onStop方法調用後,activity進程是有可能隨時被殺掉的,所以應該在onPause方法中進行數據保存操作,以免數據丟失。onSaveInstanceState方法也是完成類似的功能,數據保存在給定的bundle裡。因為onSaveInstanceState不是activity生命周期函數,android API更推薦在onPause方法中去保存數據。
不做任何處理,切換下橫豎屏,看看打印,可以發現先是銷毀然後再重新創建了activity
為了解決上述問題,一般會有幾個辦法
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