android activity 生命週期簡介
activity 生命週期有6個過程 onCreate(Bundle savedInstanceState) --》 onStart() --》onResume() --》onPause() --》onStop() -->onDestroy() 其中前3個 onCreate(Bundle savedInstanceState) --》 onStart() --》onResume() 為生命週期開始時呼叫,onPause() --》onStop() -->onDestroy() 為結束時呼叫。
當我們使用hone鍵時,activity 並沒有呼叫 onDestroy() ,只是呼叫了 onPause() --》onStop() 並沒有銷燬該activity,也就是說當前的activity 還在記憶體中,其儲存資料都沒有被銷燬,而回到程式則是呼叫了順序為 onRestart()--》 onStart() --》onResume() 。當我們在activity跳轉的時候 只要不呼叫this.finish() 或者System.exit(0)(這兩個函式的區別網上有資料的,在這我就不多說了),也只是將程式停止了,而沒有銷燬。 而我們在點選返回鍵時,系統是呼叫了一個下面的函式:
@Override
public void onBackPressed() {
// TODO Auto-generated method stub
super.onBackPressed();
}
這個函式實際上也是呼叫了onDestory() 如果我們不想呼叫該方法的發,可以在將這個函式重寫。
對於這個的週期我寫了一個例子,各位可以看一下打出來的log日誌,就能明白其呼叫的順序了,程式碼如下:
package com.lifeCy.activity; import android.app.Activity; import android.os.Bundle; public class LifeCyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); System.out.println("create"); } @Override protected void onDestroy() { System.out.println("destroy"); super.onDestroy(); } @Override protected void onPause() { System.out.println("pause"); super.onPause(); } @Override protected void onRestart() { System.out.println("restart"); super.onRestart(); } @Override protected void onResume() { // TODO Auto-generated method stub System.out.println("resume"); super.onResume(); } @Override protected void onStart() { System.out.println("start"); super.onStart(); } @Override protected void onStop() { System.out.println("stop"); super.onStop(); } @Override public void onBackPressed() { // TODO Auto-generated method stub super.onBackPressed(); } }
接下來要說的就是我們為什麼要了解activity 的生命週期,對於很多開發者而言,使用的都是onCreate()方法初始話介面和資料,其他週期過程中的函式很少使用。那不多說我舉一個例子吧,一個小函式:
public void test(){
new Thread(new Runnable() {
public void run() {
while(true){
System.out.println("stop me ");
}
}
}).start();
}
當這個執行緒在activity中啟動的之後,在activity退出呼叫了 destroy方法,你依然可以從logcat 中 看到一直列印的log,列印log 還是小事,如果你寫的是一個引數傳遞的函式的時候,當你下次啟動,他又會啟動一個新的執行緒,這樣就會很麻煩。那怎麼解決啦, 很簡單,我們知道,每個activity終止的時候都會呼叫 onDestroy()這個方法,那麼我們就在這個方法中去終止它,記住我試過終止執行緒如果你用的是interrupt(),那麼很遺憾,我試過,log 還是會列印,停止不了,只能用stop()方法。而stop方法有是一個存在風險的方法。
所以一般我做這個的時候使用的是下面的方法:不是用true 而是使用一個變數,當需要時,它是一個為true的值,當不需要或activity 退出時,將它置為 false。程式碼如下:
private boolean index = true;
public void test(){
new Thread(new Runnable() {
public void run() {
while(index){
System.out.println("stop me ");
}
}
}).interrupt();
}
@Override
protected void onDestroy() {
this.index = false;//在這兒改變變數
super.onDestroy();
}
同理,當我們使用home鍵的時候,返回時,也可做一些操作。
最後,我覺得作為一個IT從業人員而言,光知道怎麼用是不夠的,必要的時候,也得了解一下它是怎麼的構造和思想是怎麼樣的。 瞭解這些不僅對程式設計有用,而且還能學到一些程式設計思想,在日後的工作加以應用,這樣有很大的提高。
本文中如果有什麼不對 或這有疑問的地方,歡迎大家指出來,一起交流。