標籤:
關於Activity的生命週期:
下面是Activity整個生命週期中,狀態發生變化時所回調的方法,它們對應著Activity完整的生命過程。
void onCreate(Bundle savedInstanceState):Activity被建立時回調
void onStart() :在onCreate()或者onRestart()之後被調用,即Activity第一次建立或者從不可見變為可見狀態時調用。
void onResume() :恢複到活動狀態時回到,在onStart()之後一定會調用該方法。之後該活動就處於活動狀態了,處於任務棧的棧頂。
void onPause() :失去焦點,但是仍然部分可見時回調。
void onStop() :Activity變為完全不可見時回調
void onRestart() :Activity重新啟動時回調
void onDestroy() :Activity被銷毀前回調
上面的7個方法,除了onRestart()之外,在生命週期的圖中都是成對出現的。分為三對,也就出現了三種生存期。
從onCreate()到onDestroy(),一個Activity執行個體經曆了建立到銷毀的所有過程,被稱之為完整生存期。
從onStart()到onStop(),一個Activity執行個體從可見狀態變為不可見狀態,被稱之為可見生存期。注意,可見並不一定處於棧頂,因而並一定能與使用者互動。
從onResume()到onPause(),一個Activity執行個體經曆了從活動狀態到暫停狀態,這兩個方法之間的過程,該Activity執行個體都處於活動狀態,被稱之為前台生存期,或者活動狀態生存期。
完整生命週期程式示範,參考《第一行代碼》
程式有三個Activity:MainActivity是入口,放置兩個按鈕,分別用於啟動另外兩個Activity,實現7個生命週期回調方法,分別輸出一條運行資訊;NormalActivity就是一個普通的Activity;DialogActivity在Manifest.xml中配置了theme屬性,使其成為一個對話方塊樣式的Activity,<activity android:name=".DialogActivity" android:theme="@android:style/Theme.Dialog"></activity>。
具體代碼:
main_layout.xml:
1 <?xml version="1.0" encoding="utf-8"?> 2 3 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 4 5 android:layout_width="match_parent" 6 7 android:layout_height="match_parent" 8 9 android:orientation="vertical" >10 11 <Button12 13 android:id="@+id/normal"14 15 android:layout_width="wrap_content"16 17 android:layout_height="wrap_content"18 19 android:text="@string/start_normal_activity"/>20 21 <Button22 23 android:id="@+id/dialog"24 25 android:layout_width="wrap_content"26 27 android:layout_height="wrap_content"28 29 android:text="@string/start_dialog_activity"/>30 31 </LinearLayout>
MainActivity.java:
1 public class MainActivity extends ActionBarActivity implements OnClickListener { 2 3 @Override 4 5 public void onClick(View view) { 6 7 // TODO Auto-generated method stub 8 9 switch (view.getId()) { 10 11 case R.id.normal: 12 13 Intent intent1 = new Intent(this, NormalActivity.class); 14 15 startActivity(intent1); 16 17 break; 18 19 case R.id.dialog: 20 21 Intent intent2 = new Intent(this, DialogActivity.class); 22 23 startActivity(intent2); 24 25 default: 26 27 break; 28 29 } 30 31 } 32 33 @Override 34 35 protected void onCreate(Bundle savedInstanceState) { 36 37 super.onCreate(savedInstanceState); 38 39 setContentView(R.layout.main_layout); 40 41 Log.i("LIFECYCLE","onCreate"); 42 43 Button btnNormal = (Button) findViewById(R.id.normal); 44 45 Button btnDialog = (Button) findViewById(R.id.dialog); 46 47 btnNormal.setOnClickListener(this); 48 49 btnDialog.setOnClickListener(this); 50 51 } 52 53 @Override 54 55 protected void onStop() { 56 57 // TODO Auto-generated method stub 58 59 super.onStop(); 60 61 Log.i("LIFECYCLE","onStop"); 62 63 } 64 65 @Override 66 67 protected void onDestroy() { 68 69 // TODO Auto-generated method stub 70 71 super.onDestroy(); 72 73 Log.i("LIFECYCLE","onDestroy"); 74 75 } 76 77 @Override 78 79 protected void onPause() { 80 81 // TODO Auto-generated method stub 82 83 super.onPause(); 84 85 Log.i("LIFECYCLE","onPause"); 86 87 } 88 89 @Override 90 91 protected void onStart() { 92 93 // TODO Auto-generated method stub 94 95 super.onStart(); 96 97 Log.i("LIFECYCLE","onStart"); 98 99 }100 101 @Override102 103 protected void onRestart() {104 105 // TODO Auto-generated method stub106 107 super.onRestart();108 109 Log.i("LIFECYCLE","onRestart");110 111 }112 113 @Override114 115 protected void onResume() {116 117 // TODO Auto-generated method stub118 119 super.onResume();120 121 Log.i("LIFECYCLE","onResume");122 123 }124 125 }
運行資訊:
首先啟動該應用程式,依次輸出:
可見,正如生命週期圖中所示,依次調用了onCreate()、onStart()、onResume()。
然後點擊第一個按鈕,啟動那個普通的Activity,依次輸出:
可見,當NormalActivity啟動時,MainActivity調用onPause()進入暫停狀態,由於NormalActivity啟動後,MainActivity被NormalActivity完全遮住時,又要調用onStop()進入停止狀態。
然後,點擊模擬器的返回按鈕,依次輸出:
可見,由於按下返回鍵後,NormalActivity被銷毀,MainActivity由不可見狀態變為可見狀態,則依次調用onRestart()、onStart(),又由於MainActivity當前處於任務棧棧頂,所以又調用onResume()進入活動狀態。
然後,點擊第二個按鈕,啟動DialogActivity,依次輸出:
由於MainActivity仍然有部分可見,只是當前不再處於任務棧棧頂而已,所以調用了onPause()進入暫停狀態。
然後,按下模擬器上的返回按鈕,依次輸出:
DialogActivity被銷毀,MainActivity重新回到棧頂,調用onResume()進入活動狀態。
然後,再按下模擬器上的返回按鈕,依次輸出:
MainActivity要被銷毀,從活動狀態到銷毀狀態,依次調用了onPause()、onStop()和onDestroy()。
以上就是一個完整的Activity生命週期示範。
此外,由於停止狀態和暫停狀態的Activity有可能被系統回收資源,當一個Activity從暫停或者停止狀態重新回到活動狀態時,由於可能已經被回收依次,之前的操作、資料等,如填寫了好大一張表單,全都要重新開始,使用者體驗極差。這時,就要用到涉及Activity執行個體狀態儲存的回呼函數:
onSaveInstanceState(Bundle bundle):用於在被系統回收之前,將需要儲存的一些Activity執行個體狀態資訊,重要資料等儲存到bundle對象中。當該Activity執行個體下次被建立時,調用onCreate(Bundle bundle)方法時,這個bundle對象會傳遞給onCreate()方法,則可以在onCreate方法中,擷取到上次儲存的資料,進行相應的初始化,恢複工作。
android菜鳥學習筆記8----Activity(二)