一、Activity的基本概念
Activity是Android的四大組件之一,它是一種可以包含用戶界面的組件,主要用於和用戶進行交互,比如打電話,照相,發送郵件,或者顯示一個地圖!Activity用於顯示用戶界面,用戶通過Activity交互完成相關操作 , 一個App允許有多個Activity。
二、Activity的生命周期
Activity生命周期是每一個Android開發者都必須掌握的,當我們深入理解活動的生命周期之后,就可以寫出更加連貫流暢的程序,讓我們的程序擁有更好的用戶體驗
2.1、Activity的生命周期圖
先上一張從圖吧,圖片看上去一目了然。圖片來源(http://www.runoob.com/w3cnote/android-tutorial-activity.html)
2.2、Activity的四種狀態
每個Activity在其生命周期中最多可能會有四種狀態。
1.運行狀態
當一個Activity位於返回棧(關於返回棧的概念下面再介紹)的棧頂時,這時Activity就處於運行狀態,系統會將處於棧頂的Activity顯示給用戶。
2.暫停狀態
當一個Activity不再處於棧頂位置,但仍然可見,這時Activity就進入了暫停狀態。初學者可能會有這樣的疑問,既然Activity都已經不在棧頂了,怎么會還可見呢,這是因為並不是每一個Activity都會占滿整個屏幕的,比如對話框形式的Activity只會占用屏幕中間的部分區域。
3.停止狀態
當一個Activity不再處於棧頂位置,並且完全不可見的時候,就進入了停止狀態。
4.銷毀狀態
當一個Activity從返回棧中移除后就變成了銷毀狀態。
2.3、Android返回棧
Android是使用任務(Task)來管理Activity的,一個任務就是一組存放在棧里的Activity集合,這個棧被稱作返回棧,棧(堆棧)是一種先進后出的數據結構,這里順便提一下另一種常見的數據結構:隊列,隊列是一種先進先出的數據結構。
每當啟動一個新的Activity時,它會被放入返回棧中,並處於棧頂的位置。每當我們按下Back鍵或調用activity的finish()方法去銷毀一個活動時,處於棧頂的Activity會出棧,這時前一個入棧的Activity就會重新處於棧頂的位置。系統總是會顯示處於棧頂的Activity給用戶。
2.4、Activity的生存期
Activity類中定義了7個回調方法,覆蓋了Activity生命周期的每一個環節,下面來一一介紹這7個方法
1.onCreate()
這個方法在每一個Activity類都會有,當我們新建一個Activity類時,一定會重寫父類的onCreate方法,onCreate方法會在Activity第一次被創建時調用。我們應該在這個方法中完成Activity的初始化操作,比如說加載布局,初始化布局控件,綁定按鈕事件等。
2.onStart()
這個方法在Activity由不可見變為可見時調用。
3.onResume()
這個方法在Activity准備好喝用戶交互的時候調用。此時的Activity一定位於返回棧的棧頂,並且處於運行狀態。
4.onPause()
這個方法在系統准備去啟動或者恢復另一個Activity的時候調用。
5.onStop()
這個方法在Activity完全不可見的時候調用。它和onPause()方法的主要區別在於,如果啟動的新Activity是一個對話框式的activity,那么,onPause()方法會得到執行,而onStop()方法並不會執行。
6.onDestory()
這個方法在Activity被銷毀之前調用,之后Activity的狀態將變為銷毀狀態。
7.onRestart()
這個方法在Activity由停止狀態變為運行狀態之前調用,也就是Activity被重新啟動了。
三、體驗Activity的生命周期
前面介紹了關於Activity的點點滴滴,下面我們來親自實戰一下,新建一個LifecycleActivity,用於演示LifecycleActivity的生命周期,代碼如下:
1 package com.nyl.activitysummary; 2 3 import android.app.Activity; 4 import android.content.Intent; 5 import android.os.Bundle; 6 import android.util.Log; 7 import android.view.View; 8 import android.view.Window; 9 import android.widget.Button; 10 11 /** 12 * Activity生命周期演示 13 */ 14 public class LifecycleActivity extends Activity implements View.OnClickListener { 15 16 private static final String TAG = LifecycleActivity.class.getSimpleName(); 17 18 private Button btnNormal; 19 private Button btnDialog; 20 21 /** 22 * activity第一次創建時被調用 23 * @param savedInstanceState 24 */ 25 @Override 26 protected void onCreate(Bundle savedInstanceState) { 27 super.onCreate(savedInstanceState); 28 Log.d(TAG,"onCreate()→android系統調用onCreate方法第一次創建LifecycleActivity,LifecycleActivity此時處於【運行狀態】"); 29 //去掉標題 30 requestWindowFeature(Window.FEATURE_NO_TITLE); 31 //加載布局 32 setContentView(R.layout.activity_lifecycle); 33 //初始化控件 34 initView(); 35 } 36 37 /** 38 * 初始化視圖 39 */ 40 private void initView() { 41 btnNormal = (Button) findViewById(R.id.btnNormal); 42 btnDialog = (Button) findViewById(R.id.btnDialog); 43 44 btnNormal.setOnClickListener(this); 45 btnDialog.setOnClickListener(this); 46 } 47 48 @Override 49 public void onClick(View view) { 50 switch (view.getId()){ 51 case R.id.btnNormal: 52 Intent intent = new Intent(LifecycleActivity.this,NormalActivity.class); 53 startActivity(intent); 54 break; 55 case R.id.btnDialog: 56 Intent intent1 = new Intent(LifecycleActivity.this,DialogActivity.class); 57 startActivity(intent1); 58 break; 59 } 60 } 61 62 /** 63 * activity從后台重新回到前台(由不可見變為可見)時被調用 64 */ 65 @Override 66 protected void onStart() { 67 super.onStart(); 68 Log.d(TAG,"onStart()→LifecycleActivity從后台重新回到前台(由不可見變為可見),android系統調用了onStart方法,LifecycleActivity此時處於【運行狀態】"); 69 } 70 71 /** 72 * Activity准備好和用戶進行交互的時候被調用 73 */ 74 @Override 75 protected void onResume() { 76 super.onResume(); 77 Log.d(TAG,"onResume()→LifecycleActivity准備好和用戶進行交互的,android系統調用了onResume方法,LifecycleActivity此時處於【運行狀態】"); 78 } 79 80 /** 81 * Activity准備去啟動或者恢復另一個Activity的時候調用 82 */ 83 @Override 84 protected void onPause() { 85 super.onPause(); 86 Log.d(TAG,"onPause()→LifecycleActivity准備去啟動另一個Activity,android系統調用了onPause方法,LifecycleActivity此時處於【暫停狀態】"); 87 } 88 89 /** 90 * 退出當前Activity或者跳轉到新Activity時被調用 91 * Activity完全不可見的時候調用 92 */ 93 @Override 94 protected void onStop() { 95 super.onStop(); 96 Log.d(TAG,"onStop()→LifecycleActivity已經完全不可見了,android系統調用了onStop方法,LifecycleActivity此時處於【停止狀態】"); 97 } 98 99 /** 100 * 退出當前Activity時被調用,調用之后Activity就結束了 101 */ 102 @Override 103 protected void onDestroy() { 104 super.onDestroy(); 105 Log.e(TAG,"onDestroy()→LifecycleActivity已經准備被銷毀了,android系統調用了onDestroy方法,LifecycleActivity此時處於【銷毀狀態】"); 106 } 107 108 /** 109 * Activity從后台重新回到前台時被調用 110 */ 111 @Override 112 protected void onRestart() { 113 super.onRestart(); 114 Log.e(TAG,"onRestart()→LifecycleActivity由【停止狀態】變為【運行狀態】,android系統調用了onRestart方法,LifecycleActivity此時處於【運行狀態】"); 115 } 116 }
為了演示生命周期,我們還需要分別再創建兩個子Activity,分別為NormalActivity和DialogActivity,代碼如下:
1 package com.nyl.activitysummary; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.view.Window; 6 7 /** 8 * 正常顯示的Activity 9 */ 10 public class NormalActivity extends Activity { 11 12 @Override 13 protected void onCreate(Bundle savedInstanceState) { 14 super.onCreate(savedInstanceState); 15 requestWindowFeature(Window.FEATURE_NO_TITLE); 16 setContentView(R.layout.activity_normal); 17 } 18 }
1 package com.nyl.activitysummary; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.view.Window; 6 7 /** 8 * 以Dialog的形式展示的Activity 9 */ 10 public class DialogActivity extends Activity { 11 12 @Override 13 protected void onCreate(Bundle savedInstanceState) { 14 super.onCreate(savedInstanceState); 15 requestWindowFeature(Window.FEATURE_NO_TITLE); 16 setContentView(R.layout.activity_dialog); 17 } 18 }
在LifecycleActivity的onCreate方法中,分別注冊了兩個按鈕的點擊事件,點擊第一個按鈕會啟動NormalActivity,點擊第二個按鈕會啟動DialogActivity,然后我們在LifecycleActivity的7個回調方法中通過Log打印一句話,這樣就可以通過觀察日志的方式來清楚地看到LifecycleActivity的生命周期
LifecycleActivity的生命周期控制台打印日志效果如下:
關於Activity的基本概念與Activity的生命周期的總結內容就寫這么多。