android菜鳥學習筆記8----Activity(二)

來源:互聯網
上載者:User

標籤:

關於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(二)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.