1. 程式人生 > >android activity 生命週期簡介

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從業人員而言,光知道怎麼用是不夠的,必要的時候,也得了解一下它是怎麼的構造和思想是怎麼樣的。 瞭解這些不僅對程式設計有用,而且還能學到一些程式設計思想,在日後的工作加以應用,這樣有很大的提高。

本文中如果有什麼不對 或這有疑問的地方,歡迎大家指出來,一起交流。