一個Acitivity是一個應用的程序組件,提供一個屏幕,用戶可以用來交互完成某些任務.
一個應用通常由多個Activity組成.
那麼在交互的過程中,必然會存在交互的各種狀態,那麼這些狀態在整個Activity中我們應該如何控制,以及在這個過程中我們可以做些什麼,在哪裏做呢?
Activity的生命週期可以按官方所提供這張圖來理解
接下來我直接在代碼中記錄和整理可以在Activity生命週期中我們可以做些什麼.
<span style="font-size:18px;">public class MainActivity extends AppCompatActivity {
//Activity被創建時調用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
* 1,Activity一被創建便會執行onCreate方法創建,僅會在第一次創建時調用
*
* 2,如果在onSaveInstanceState()方法中曾記錄過Activity的狀態,savedInstanceState中會保存以前的狀態.
*
* 3,之後執行onStart()方法;
*
* 此方法是做所有初始化設置的地方,創建視圖,綁定數據等.
*/
}
//Activity由不可見變爲可見時調用
@Override
protected void onStart() {
super.onStart();
/**
* 1,隨着程序是否爲用戶可見被多次調用
*
* 2,從onStart到onStop 爲整個Activity的可視生命週期,
*
* 3,之後執行onResume()方法;
*
* 可以在此進行註冊BroadcastReceiver來監控影響UI的改變.或加載一些資源等.
*/
}
//Activity可見時就會被調用
@Override
protected void onResume() {
super.onResume();
/**
* 1,此時我們獲得焦點可與用戶進行交互
*
* 2,前臺的生命週期自onResume()直到onPause()爲止.在此期間Activity總是可見的.
*
* 3,此時的Activity一定是位於棧頂的.並接受用戶的輸入.
*
* 4,Activity會經常在暫停與恢復之間進行狀態轉換.
*
* 之後總會執行onPause()方法;
*/
}
//Activity可見不可操作時被調用
@Override
protected void onPause() {
super.onPause();
/**
* 1,當Activity準備去啓動另一個Activity時.
*
* 2,可以在此方法中將未保存的數據進行持久化,或釋放掉一些消耗CPU的資源(比如動畫)
*
* 3,此方法中執行速度一定要快,下一個活動會等待此方法執行完纔會執行.
*
* 當Activity回到前臺執行onResume();
* 當Activity變爲不可見時執行onStop();
*/
}
//Activity完全不可見時被調用
//退出當前Activity或者跳轉到新Activity時被調用
@Override
protected void onStop() {
super.onStop();
/**
* 1,停滯狀態,此時Activity完全不可見,從可見到完全不可見之時被調用
*
* 2,從onStart到onStop 爲整個Activity的可視生命週期,隨着程序是否爲用戶可見被多次調用
*
* 3,如果我們在onStart中註冊了BroadcastReceiver,可在此方法中進行取消註冊.或釋放一些資源.
*
* 4,從而保證停滯的Activity佔用更少的內存
*
* 如果再次回到前臺與用戶進行交互則執行onRestart()方法.
* 如果關閉銷燬Activity則執行onDestroy()方法;
*/
}
//Activity從後臺重新回到前臺時被調用
@Override
protected void onRestart() {
super.onRestart();
/**
* 重新開始
* 此時Activity由完全不可見變爲可見之前會被調用(onStop-onRestart-onStart之間被調用)
* 在Activity停止後,在再次啓動之前被調用
*
* 之後總會執行onStart()方法;
*/
}
//退出當前Activity時被調用,調用之後Activity就結束了
@Override
protected void onDestroy() {
super.onDestroy();
/**
* 1,銷燬Activity之前會被調用
*
* 2,可以在此方法中進行資源的釋放以節省內存等.
*
* 可以使用isFinishing()方法區分Activity是被系統銷燬或Activity正常結束.
*/
}
//Activity窗口獲得或失去焦點時被調用
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
/**
* 1,在可否與用戶交互之間調用
*
* 2,可在此方法中獲取視圖組件的尺寸大小.
*
* 3,總是在onResume之後或onPause之後被調用
*/
}
/**
* Activity被系統殺死時被調用.
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
/**
* 例如:
* 1,屏幕方向改變時,Activity被銷燬再重建;
* 2,當前Activity處於後臺,系統資源緊張將其殺死.
* 3,另外,當跳轉到其他Activity或者按Home鍵回到主屏時該方法也會被調用,系統是爲了保存當前View組件的狀態.
* 4,在onStop之前被調用也可能在onPause()之前.
* tip: 官方文檔爲it does so before onStop() and possibly before onPause()..
*<span style="white-space:pre"> </span>
* 通常在此方法中保存Activity的一些臨時狀態.
*/
}
/**
* Activity被系統殺死後再重建時被調用.
*/
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
/**
* 例如:
* 1,屏幕方向改變時,Activity被銷燬再重建之時;
* 2,當前Activity處於後臺,系統資源緊張將其殺死,用戶又啓動該Activity.
* 3,這兩種情況下onRestoreInstanceState都會被調用,在onStart之後.
*
* 在此方法中我們可以進行一些數據的恢復.
*/
}
}</span>
簡單總結一下
一個完整的Activity生命週期,從第一次調用onCreate()開始直到調用onDestroy()爲止.
因爲方法比較多那麼我們可以進行最基本的分類
一,Activity的可見的生命週期
onStart()-onResume()-onPause()-onStop();
1,可與用戶交互狀態
onResume();
2,不可與用戶交互狀態(可以看見但不能進行操作,比如被另一個透明的Activity所覆蓋)
onPause();
二,Activity處於用戶不可見的狀態
onStop(); 處在不可見狀態的Activity處於停滯狀態.
Activity中還有更爲細節的方法以及在這些方法中我們可以做些什麼操作,個人認爲更多的用法需要結合實際的需求與需要,並不是全部都用上就萬無一失的,何時用,怎麼用更是需要在長期使用中切身體會的.更多的是體會google如此設計的初衷以及學習其思考方式.
學習參考自:
感謝大牛的文章,學習到很多東西,個人能力有限,僅按個人學習的過程中做一些心得體會.
關於在onCreate()方法中獲取Activity保存的狀態還是在onRestoreInstanceState()方法中獲取的區別可以學習Android開發之InstanceState詳解這篇文章.