天天看點

Android Activity及生命周期

第二篇技術文檔來了解下Activity。

什麼是Activity?

activity 是android最常見的元件,是android 四大常用元件之一。activity是人機互動的界面,每一個actiivty都表示一個螢幕,應用程式會把它呈現給使用者,應用程式越負責,需要的螢幕越多。

Activity的生存期

每一個Activity的狀态是由它在Activity棧中所處的位置所決定的,Activity棧是目前所有正在運作的Activity的先進後出的集合。

當一個新的Activity啟動時,它就變為Activity狀态,并被移動到棧頂。

如果使用者使用傳回鍵傳回到了剛才的Activity或者目前Acivity被關閉了,那麼棧中下一個Activity就會移動到棧頂,激活成活動狀态。

Android Activity及生命周期

Activity的狀态

随着Activity的建立與銷毀,在棧中移出移進會經曆4個狀态。

Android Activity及生命周期

活動狀态

當一個Actiivty位于棧頂的時候,它是可見的并且具有焦點的前台Activity。android将會不惜一切代價來保持它處于活動狀态,并根據需要來銷毀下面部分的Activity來保證這個Activity擁有它所需要的資源。

暫停狀态

在某些情況下,activity是可見的,但是沒有獲得焦點,此時它就處于暫停狀态。當一個透明或者非全屏的Activity位于該Activity之前時就是暫停狀态。當Activity被暫停的時候,它仍然會被當作近似于活動狀态的狀态,

但是不能接收使用者的輸入事件。在極端的情況下,android也會終止暫停的Activity,為活動狀态的Activity擷取資源。

停止狀态

當一個Activity不可見的時候,它就處于停止狀态。此時Activity仍然會停留在記憶體中,儲存所有的狀态資訊,然而android系統在其他地方需求使用記憶體的時候,它就會成為首要的候選對象。在一個Activity停止的時候,

儲存資料和目前的UI狀态以及停止任何關鍵操作都是很重要的。

非活動狀态

當一個Activity被終止之後,在啟動它之前它就處于非活動狀态。處于非活動狀态的Activity已經從Activity棧中移除了,是以在他們可以被顯示和使用之前,需要被重新啟動。

狀态的轉化是非确定性的,完全由android記憶體管理器處理。Android首先會關閉包含非活動狀态Activity的應用程式,接着是停止的應用程式。隻有極端情況下,才會銷毀暫停的應用程式。

Activity的生命周期

為了保證Activity可以對狀态改變做出反應,Android提供了一系列時間處理程式,當Actiivty在完整的,可見的和活動的生存期之間轉化時,它們就會被觸發。

Android Activity及生命周期

了解一個應用的生命周期,最好手動實踐一下

package com.example.activitytest;

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

public class MainActivity extends Activity {

	private static final String TAG = "testActivity";

	private Button button;

	// activity 建立初始調用
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Log.i(TAG, "onCreate() called.");

		// TODO 初始化一個Activity 并且填充UI

		button = (Button) findViewById(R.id.button);

		button.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {

				startActivity(new Intent(MainActivity.this,
						TranslucentActivity.class));

			}
		});
	}

	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState) {
		super.onRestoreInstanceState(savedInstanceState);
		Log.i(TAG, "onRestoreInstanceState() called.");

		// TODO Activity被系統殺死後再重建時被調用.
		// 例如:螢幕方向改變時,Activity被銷毀再重建;目前Activity處于背景,系統資源緊張将其殺死,使用者又啟動該Activity.
		// 這兩種情況下onRestoreInstanceState都會被調用,在onStart之後.
	}

	// 當activity 從停止狀态到活動狀态調用
	@Override
	protected void onRestart() {
		super.onRestart();
		Log.i(TAG, "onRestart() called.");
	}

	// 當activity建立或者從停止狀态到活動狀态調用
	@Override
	protected void onStart() {
		super.onStart();
		Log.i(TAG, "onStart() called.");
	}

	// 當activity建立或者從停止狀态到活動狀态調用
	@Override
	protected void onResume() {
		super.onResume();
		Log.i(TAG, "onResume() called.");
	}

	// 當activity處于暫停狀态的時候 調用
	@Override
	protected void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
		Log.i(TAG, "onSaveInstanceState() called.");
	}

	// 當activity處于暫停狀态的時候 調用
	@Override
	protected void onPause() {
		super.onPause();
		Log.i(TAG, "onPause() called.");
		
		//TODO 在onPause方法中也可能程序會被終止是以有必要的花  也要儲存所有的編輯或者狀态改變
	}

	// 退出目前Activity或者跳轉到新Activity時被調用
	@Override
	protected void onStop() {
		super.onStop();
		Log.i(TAG, "onStop() called.");

		// TODO 挂起不需要的UI更新,線程或處理
		// 當activity不可見時,儲存所有的編輯或者狀态改變,因為在調用這個方法後,程序可能會被終止
	}

	// 退出目前Activity時被調用,調用之後Activity就結束了
	@Override
	protected void onDestroy() {
		super.onDestroy();
		Log.i(TAG, "onStop() called.");

		// TODO 清理所有的資源,包括線程 關閉資料庫連接配接等
	}

}
           

當項目剛啟動的調用的是 onCreate() > onStart() > onResume() ,退出Actiivty調用的是onPause()>onStop()>onDestory()方法,結束目前Activity。

點選home鍵,Activity處于停止狀态  調用的是onPause()>OnSaveInStanceState()>onStop(), 從停止狀态傳回到活動狀态 調用的是onRestart()>onStart()>OnResume()

啟動一個透明的Activity 目前activity處于暫停狀态 調用的是OnPause>OnSaveInStanceState(),從暫停的狀态傳回到活動狀态 調用的是OnResume()

目前Activity處于暫停狀态或者停止狀态,系統記憶體不足,殺死目前Activity,而後使用者退回目前Activity:再次調用onCreate() > onStart() > onResume()。

參考書:Android 4 進階程式設計第三版