第二篇技術文檔來了解下Activity。
什麼是Activity?
activity 是android最常見的元件,是android 四大常用元件之一。activity是人機互動的界面,每一個actiivty都表示一個螢幕,應用程式會把它呈現給使用者,應用程式越負責,需要的螢幕越多。
Activity的生存期
每一個Activity的狀态是由它在Activity棧中所處的位置所決定的,Activity棧是目前所有正在運作的Activity的先進後出的集合。
當一個新的Activity啟動時,它就變為Activity狀态,并被移動到棧頂。
如果使用者使用傳回鍵傳回到了剛才的Activity或者目前Acivity被關閉了,那麼棧中下一個Activity就會移動到棧頂,激活成活動狀态。
Activity的狀态
随着Activity的建立與銷毀,在棧中移出移進會經曆4個狀态。
活動狀态
當一個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在完整的,可見的和活動的生存期之間轉化時,它們就會被觸發。
了解一個應用的生命周期,最好手動實踐一下
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()。