Android學習第六天之組件篇初探Activity1.1

一:導讀

       Android應用程序由四大組件構成最基本的框架,分別是Activity,Service,BroadcastReceiver和Content Provider,而在組件和程序之間進行消息傳遞則使用Intent。同時,針對線程之間的信息傳遞也提出了自己的通信機制。其中,Activity是最重要也是使用頻率最高的組件。一個Activity通常是一個單獨的全屏顯示界面,在其中有若干視圖控件以及對應的事件處理。大部分應用程序都包含了多個Activity,當多個Activity相互跳轉切換時,就形成一個Activity棧,以及Activity之間的數據交換。

二:Activity生命週期

(1.1)圖解分析:


onCreate()方法:在創建Activity時被調用。該方法是最常見的方法,每個活動中我們都重寫了這個方法。在Eclipse中創建Android項目時,會自動創建一個Activity,在該Activity中,默認重寫了onCreate(Bundle savedInstanceState)方法,用於該Activity執行初始化。你應該在這個方法中完成活動的初始化操作,比如說加載布 局、綁定事件等

onStart()方法:這個方法在活動由不可見變爲可見的時候調用。 

onResume()方法:當Activity由暫停狀態恢復爲活動狀態時調用。調用該方法後,該Activity位於Activity棧的棧頂,並且處於運行狀態(可見狀態)。

onPause()方法:暫停Activity時被回調,該方法需要被非常快速的執行,因爲直到該方法執行完畢後,下一個Activity才能被恢復。在該方法中,通常用於持久保持數據:我們通常會在這個方 法中將一些消耗 CPU 的資源釋放掉,以及保存一些關鍵數據,但這個方法的執行速度 一定要快,不然會影響到新的棧頂活動的使用。例如,當我們正在玩遊戲時,突然來了一個電話,這時就可以在該方法中將遊戲狀態持久保存起來。

onStop()方法:停止Activity時被回調,即在活動完全不可見的時候調用。它和 onPause()方法的主要區別在於,如 果啓動的新活動是一個對話框式的活動,那麼 onPause()方法會得到執行,而 onStop() 方法並不會執行。

onDestroy()方法:這個方法在活動被銷燬之前調用,之後活動的狀態將變爲銷燬狀態。

onRestart()方法:這個方法在活動由停止狀態變爲運行狀態之前調用,也就是活動被重新啓動了。 以上七個方法中除了 onRestart()方法,其他都是兩兩相對的。

二:實例測試探究

下面做一個實例進行測試:創建兩個Activity(MainActivity和ActivityTwo)分別重寫上述方法。給MainActivity添加按鈕並實現點擊事件(跳轉到ActivityTwo)。

 MainActivity.java

package com.example.activitytest;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;


public class MainActivity extends Activity {
	private Button btnButton;
	

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btnButton = (Button)findViewById(R.id.btnButton);
        btnButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent intent = new Intent(MainActivity.this,ActivityTwo.class);
				startActivity(intent);
			}
		});
        Log.e("TAG", "MainActivity onCreate() method is executed");
    }
    
    
    @Override
	protected void onStart() {
		// TODO Auto-generated method stub
		super.onStart();
		Log.e("TAG", "MainActivity onStart() method is executed");
	}
    
    @Override
    protected void onRestart() {
    	// TODO Auto-generated method stub
    	super.onRestart();
    	Log.e("TAG", "MainActivity onRestart() method is executed");
    }
    
    @Override
    protected void onPause() {
    	// TODO Auto-generated method stub
    	super.onPause();
    	Log.e("TAG", "MainActivity onPause() method is executed");
    }
    
    @Override
    protected void onResume() {
    	// TODO Auto-generated method stub
    	super.onResume();
    	Log.e("TAG", "MainActivity onResume() method is executed");
    }
    
    @Override
    protected void onStop() {
    	// TODO Auto-generated method stub
    	super.onStop();
    	Log.e("TAG", "MainActivity onStop() method is executed");
    }
    
    @Override
    protected void onDestroy() {
    	// TODO Auto-generated method stub
    	super.onDestroy();
    	Log.e("TAG", "MainActivity onDestroy() method is executed");
    }


}
ActivityTwo.java

package com.example.activitytest;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;


public class ActivityTwo extends Activity {
	

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_two);
        Log.e("TAG", "ActivityTwo onCreate() method is executed");
    }
    
    @Override
	protected void onStart() {
		// TODO Auto-generated method stub
		super.onStart();
		Log.e("TAG", "ActivityTwo onStart() method is executed");
	}
    
    @Override
    protected void onRestart() {
    	// TODO Auto-generated method stub
    	super.onRestart();
    	Log.e("TAG", "ActivityTwo onRestart() method is executed");
    }
    
    @Override
    protected void onPause() {
    	// TODO Auto-generated method stub
    	super.onPause();
    	Log.e("TAG", "ActivityTwo onPause() method is executed");
    }
    
    @Override
    protected void onResume() {
    	// TODO Auto-generated method stub
    	super.onResume();
    	Log.e("TAG", "ActivityTwo onResume() method is executed");
    }
    
    @Override
    protected void onStop() {
    	// TODO Auto-generated method stub
    	super.onStop();
    	Log.e("TAG", "ActivityTwo onStop() method is executed");
    }
    
    @Override
    protected void onDestroy() {
    	// TODO Auto-generated method stub
    	super.onDestroy();
    	Log.e("TAG", "ActivityTwo onDestroy() method is executed");
    }


}

運行程序,顯示界面如下圖


查看log顯示如下


可以看出 MainActivity分別執行了onCreate() ,onStart(),onResume()方法。此時MainActivity處於顯示狀態。

然後,我點擊按鈕startActivityTwo

界面如下:


查看log


可以看出 ,MainActivity執行了onPause()方法後,ActivityTwo執行了onCreate() ,onStart(),onResume()方法,緊接着MainActivity執行了onStop()方法此時MainActivity處於不可見狀態(暫停)狀態,ActivityTwo處於可見狀態。

下一步,點擊back(返回)鍵,顯示界面如下:


查看log


可以看出

ActivityTwo執行了onPause()方法後,MainActivity執行了onRestart(),onStart(),onResume()方法,緊接着ActivityTwo執行了onStop(),onDestroy()方法。此時,ActivityTwo處於銷燬狀態,MainActivity處於可見狀態。

最後點擊back(返回)鍵,程序完全退出,界面如下


依舊查看log


可以看出MainActivity處於銷燬狀態,至此,兩個Activity的生命週期結束。

三:總結分析結果

(一)當一個Activity第一次被創建時,依次執行onCreate() ,onStart(),onResume()方法,此時Activity處於可見狀態。

(二)當一個Activity(例如MainActivity)被另一個Activity(例如ActivityTwo)給覆蓋了,此時Activity(MainActivity))的onPause()方法會被立即執行,Activity(MainActivity)處於暫停狀態,當其他的Activity(ActivityTwo)被創建且處於可見狀態後,暫停狀態的Activity(MainActivity)會執行onStop ()進入停止狀態。即:MainActivity不可見狀態。特別的,當此時的Activity被一個Dialog覆蓋,這時的Activity並不是完全不可見,而是顯示在dialog的後面,變得失去了焦點。所以這時的Activity處於暫停狀態,而不是停止狀態。只執行onPause()方法,不會執行onStop()方法。

(三)當其他Activity(ActivityTwo)銷燬或者暫停(即:處於不可見狀態),此時的Activity(MainActivity)會執行onRestart()方法(因爲之前已經創建了,所以這裏並不需要重新創建,只要重新啓動即可),然後執行onStart(),onResume()方法(看最上面的定義即可)。MainActivity處於可見狀態。特別的,如果是由於dialog引起的暫停狀態要恢復到可見狀態,那麼這裏也不會執行onRestart()方法,因爲Activity沒用停止,只是暫停了而已,所以不需要重新啓動的。直接執行onStart(),onResume()方法即可。

(四)當一個Activity(MainActivity)完全銷燬。會依次執行,先不可見onPause(),onStop(),再銷燬onDestroy()方法,即先暫停後停止最後銷燬。

結論:

可見狀態:onCreate() ,onStart(),onResume()  

不可見狀態:onPause(),onStop ()  

銷燬狀態 :onDestroy()








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章