Android複習:Activity

來源:互聯網
上載者:User

      Activity為Android4大組件之一。Activity作為Android的表現層(presentation layer),每個螢幕都是一個Activity(或由Activity繼承而來),在Activity中使用View去構建圖形化介面來展現資訊和對使用者的操作進行響應。

      為了保護使用者體驗和對資源進行管理,需要理解Activity的生命週期。Activity的生命週期不是由Android Application來管理,而是由Android Runtime來管理。Activity的狀態由其所在Activity Stack(該棧為後進先出棧)中的位置決定,在棧頂(即最後進棧)的Activity的狀態是活動的(Active)。Activity的狀態有4種:

  • Active: 當Activity在棧頂時,它是可見的(Visible)、有焦點的(Focused)、在前台的,對使用者的操作進行響應。Android會儘可能保持它的Active狀態,即使資源不夠也會先殺掉棧底的Activity。當其它Activity變為Active時,這個Activity會變為paused狀態。
  • Paused: 在某些情況下,Activity還是可見的(Visible),但失去了焦點(如被部分覆蓋),雖然看起來它好像是活動的,但它不能對使用者的操作進行響應了。Android只有在極端缺資源的情況下才會殺這種狀態的Activity。當一個Activity完全被覆蓋時,它的狀態變為stopped。
  • Stopped: 當Activity完全不可見時(Not Visible),它的狀態是停止的,但它仍然停駐在記憶體中並保持著各UI狀態的資料。但當Android缺資源時,它是被殺掉的候選人。因此當狀態要轉為Stopped時,注意要儲存好資料和UI的狀態資料。
  • Inactive: 當Activity被殺掉後且沒有重啟前,它的狀態是inactive。這種狀態的Activity會被從棧中清除,如果需要再次顯示時需要重新啟動。

Activity的生命週期:

  • Full Lifetime: 從onCreate到onDestroy。但也有可能因為系統缺資源而在onPause或onStop階段就把Activity銷毀了。
  • Visible Lifetime: 從onStart到onStop。在這個周期裡,Activity可見(有可能是部分可見而沒有焦點),在全生命週期(Full Lifetime)中可能有多個Visible Lifetime生命週期(如Activity多次從前台轉到後台,然後再轉回前台),在系統缺乏資源的時候,會出現不調用onStop就直接銷毀Activity。
  • Active Lifetime: 從onResume到onPause。在失去焦點時、其它Activity顯示時、裝置睡眠時,該生命週期都會結束。在調用onPause之前會先調用onSaveInstanceState,以供儲存相關資料(如果不在onSaveInstanceState中儲存資料,至少要重寫onPause來儲存資料,同時根據實際情況在onPause中還可能需要關閉Thread、Process、Broadcast Receiver、Service等)

 

Activity的主要骨骼代碼:

public class MyActivityCircle extends Activity {<br />private static final int MENU_QUIT = Menu.FIRST;<br /> /** 當Activity第一次啟動時調用(或被銷毀後再次啟動時也會被調用) */<br /> @Override<br /> protected void onCreate(Bundle savedInstanceState) {<br /> setContentView(R.layout.main);<br /> }<br /> /** 在不可見後再次可見的開始時調用 */<br /> protected void onRestart() {<br /> super.onRestart();<br /> }<br /> /** 在Visible Lifecycle開始時調用 */<br /> protected void onStart() {<br /> super.onStart();<br /> }<br /> /** 在onStart()之後調用(但調用是有條件的,不是每次onStart之後都調用) */<br /> protected void onRestoreInstanceState(Bundle savedInstanceState) {<br /> super.onRestoreInstanceState(savedInstanceState);<br /> }<br /> /** 在onRestoreInstanceState()之後調用,該方法主要是供系統作最後的初始化使用,一般不重寫 */<br /> protected void onPostCreate(Bundle savedInstanceState) {<br /> super.onPostCreate(savedInstanceState);<br /> }<br /> /** 在Active Lifecycle開始時調用 */<br /> protected void onResume() {<br /> super.onResume();<br /> }<br /> /** 在onResume()之後調用,該方法主要是供系統在resume後作最後的構建使用,一般不重寫 */<br /> protected void onPostResume() {<br /> super.onPostResume();<br /> }<br /> /** 在Active Lifecycle結束時(在onPause()前)調用,用於儲存UI狀態和資料 */<br /> protected void onSaveInstanceState(Bundle outState) {<br /> super.onSaveInstanceState(outState);<br /> }<br />/** 在Active Lifecycle結束時調用 */<br /> protected void onPause() {<br /> super.onPause();<br /> }<br /> /** 在Visible Lifecycle結束時調用 */<br /> protected void onStop() {<br /> super.onStop();<br /> }<br /> /** 在Full Lifetime結束時調用 */<br /> protected void onDestroy() {<br /> Log.i(TAG, "onDestroy");<br /> textEdit = null;<br /> super.onDestroy();<br /> }<br /> /** 在Activity退出時調用 */<br /> protected void onActivityResult(int requestCode, int resultCode, Intent data) {<br /> super.onActivityResult(requestCode, resultCode, data);<br /> }<br /> /** 在按MENU鍵時調用 */<br /> public boolean onCreateOptionsMenu(Menu menu) {<br /> super.onCreateOptionsMenu(menu);<br /> menu.add(0, MENU_QUIT, Menu.NONE, "Quit");<br /> return true;<br /> }<br /> /** 選Option Menu的功能表項目時調用 */<br /> public boolean onOptionsItemSelected(MenuItem item) {<br /> super.onOptionsItemSelected(item);<br /> switch(item.getItemId()) {<br /> case MENU_QUIT:<br /> finish();<br /> break;<br /> }</p><p> return true;<br /> }<br /> /** 建立Activity的對話方塊時調用 */<br /> protected Dialog onCreateDialog(int id) {<br /> return super.onCreateDialog(id);<br /> }<br /> /** 顯示Dialog前調用 */<br /> protected void onPrepareDialog(int id, Dialog dialog) {<br /> super.onPrepareDialog();<br /> }<br /> /** 顯示Dialog時調用 */<br /> public final void showDialog(int id) {<br /> super.showDialog();<br /> }<br />}

 

 

補充:

  • 大部分情況下,onSaveInstaceState()都會被調用,一個比較常見的不調用該方法的情況是手動按“返回”鍵。判斷是否調用的標準主要是看“是否是系統已經擷取到使用者的允許”而停止活動,如使用者手動按“返回”鍵、程式中調用finish()等則認為是允許了,而按“Home“鍵、切換橫屏等則是未允許。
  • 而onRestoreInstanceState()則不常見,原因是只有在系統不經使用者允許就“暴力”地銷毀了Activity(原因主要是系統其它地方需要資源),再次回到這個Activity時會調用(如切換橫屏時,系統會先銷毀掉原來的Activity,然後再建立新的Activity,此時會調用onRestoreInstanceState)。

這兩點有說得更詳細的地方:http://zhangkun716717-126-com.javaeye.com/blog/802131

 

各方法調用測試結果如下:

正常啟動時:<br />onCreate<br />onStart<br />onPostCreate<br />onResume<br />onPostResume<br />正常啟動後按“返回”返回(相當於關閉了):<br />onPause<br />onStop<br />onDestroy<br />正常啟動後按Home鍵:<br />onSaveInstanceState<br />onPause<br />onStop<br />按Home鍵後再雙擊應用進入:<br />onRestart<br />onStart<br />onResume<br />onPostResume<br />正常啟動後切換為橫屏:<br />onSaveInstanceState<br />onPause<br />onStop<br />onDestroy<br />onCreate<br />onStart<br />onRestoreInstanceState<br />onPostCreate<br />onResume<br />onPostResume

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.