Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android.app.Activity 的介紹

android.app.Activity 的介紹

編輯:關於Android編程

發現當前Android的資料不是很多,而且對於Activity的介紹也很少,所以把官方文檔的android.app.Activity的介紹翻譯了一下,加入了一些自己的理解。各位如果覺得我自己理解的不對,請無視。歡迎郵件討論。
width=540

android.app
public class

android.app.Activity

java.lang.Object

android.content.Context

android.app.ApplicationContext ViewInflate.Factory

android.app.Activity KeyEvent.Callback Window.Callback

 

 

Activity 是用戶唯一可以看得到的東西。幾乎所有的activity都與用戶進行交互,所以Activity主要負責的就是創建顯示窗口,你可以在這些窗口裡使用setContentView(View)來顯示你自己的UI。activity展現在用戶面前的經常是全屏窗口,你也可以將activity作為浮動窗口來使用(使用設置了windowIsFloating的主題),或者嵌入到其他的activity(使用ActivityGroup)中。下面是兩個幾乎所有Activity的子類都實現了的方法。

onCreate(Bundle) 這個方法是初始化 activity的地方. 最重要的是,你經常需要在這裡使用setContentView(int) 來設置UI布局所使用的layout資源, 當你需要使用程序控制UI中的組件時可以使用 findViewById(int) 來獲得對應的視圖。

當用戶離開activity時你可以在onPause() 進行相應的操作. 更重要的是,用戶做的任何改變都應該在該點上提交 (經常提交到ContentProvider 這裡保存數據)。

如果要使用 Context.startActivity()來啟動activity, activity都必須在啟動者應用包的AndroidManifest.xml文件中有對應的 定義。

 

Activity類是 application's overall lifecycle 的一個重要部分。

 

這裡涉及到的主題:

Activity 生命周期配置改變啟動Activity並獲得結果保存持久狀態許可進程生命周期

Activity 生命周期

系統中的Activity可以通過一個activity棧來進行管理。當一個新的activity啟動的時候,它首先會被放置在activity棧頂部並成為running狀態的activity —— 之前的activity也在activity棧中,但總是被保存在它的下邊,只有當這個新的activity退出以後之前的activity才能重新回到前景界面。

 

所有的activity本質上有四種狀態:

activity在屏幕的前景中(activity棧的頂端),它是active或者running狀態。

 

activity失去了焦點但是仍然可見(這個activity頂上遮擋了一個透明的或者非全屏的activity),它的狀態是paused。一個paused狀態的activity完全是alive的(它維護自己所有的狀態和成員信息,而且仍然在window manager的管理中),但當系統內存極度貧乏時也會將其killed。

 

activity由於其他的activity而完全變暗,它就進入了stopped狀態。它仍然保持著所有的狀態和成員的信息,可是,他對於用戶來說不可見,當別的地方需要內存的時候它經常會被killed。 activity是paused或者stopped,系統需要將其清理出內存的時可以命令其finish或者簡單kill其進程。當它重新在用戶面前顯示的時候,它必須完全重新啟動並且將其關閉之前的狀態全部恢復回來。

下面的圖表是Activity的狀態圖,直角矩形代表了callback方法,你可以實現這些方法從而使Activity在改變狀態的時候執行你制定的操作。帶顏色的橢圓形是Activity的主要狀態。

 

 

這裡有三個比較關鍵的生命周期。

從最初調用onCreate(Bundle)到最終調用onDestroy()稱為完整生命周期。Activity會在onCreate()進行所有“全局”狀態的設置,在onDestroy()中釋放所有持有的資源。舉個例子,如果它有一個從網絡上下載數據的後台線程,那他可能就會在onCreate()中創建這個線程並在onDestroy()中停止這個線程。 從activity調用onStart()開始,到調用對應的onStop()為止稱為可見生命周期。在這段時間內用戶可以在屏幕上看到這個activity,盡管並不一定是在前景也不一定可以和用戶交互。在這兩個方法之間你可以維護那些activity在用戶顯示時所需的資源。舉個例子來說,你可以在onStart()中注冊一個IntentReceiver來監控那些可以對你的UI產生影響的環境改變,當你的UI不繼續在用戶面前顯示時你可以在onStop()中注銷這個IntentReceiver。每當activity在用戶面前顯示或者隱藏時都會調用相應的方法,所以onStart()和onStop()方法在整個生命周期中可以多次被調用。 從activity調用onResume()開始,到調用對應的onPause()為止稱為前景生命周期,這段時間activity處於其他所有activity的前面,且與用戶交互。一個activity可以經常在resumed和paused狀態之間轉換——例如手機進入休眠時、activity的結果返回時、新的intent到來時——所以這兩個方法中的代碼應該非常的簡短。

下面的Activity方法定義了activity完整的生命周期。他們全都是hook方法,你可以重載這些方法從而使activity在狀態改變時執行你所期望的操作。所有activity都應該實現自己的onCreate(Bundle)方法來進行初始化設置;大部分還應該實現onPause()方法提交數據的修改並且准備終止與用戶的交互。盡管我們計劃在系統中添加更多的工具來管理應用,現在大多activity仍需要實現onFreeze()並且在onCreate(Bundle)中執行對應的狀態恢復。其他的方法可以在需要時進行實現,當實現這些方法的時候需要注意的是一定要調用父類中的對應方法。

 

Java代碼
  1. public class Activity extends ApplicationContext { protected void onCreate(Bundle icicle); protected void onStart(); protected void onRestart(); protected void onResume(); protected void onFreeze(Bundle outIcicle); protected void onPause(); protected void onStop(); protected void onDestroy(); }

     

     

     

    一般來說activity的生命周期變化看起來比較象下面的表格:

     

    (此處譯者進行了大塊的修改,請參考原文閱讀下面表格)

     

     

    方法

    描述

    Killable?

    下一方法

    onCreate()

    Activity初次創建時被調用,你應該在這裡進行一般的靜態設置:創建view、將數據綁定到list等等。如果activity之前存在凍結狀態,那麼此狀態將在Bundle中提供。

    如果activity首次創建,本方法後將會調用onStart(),如果activity是停止後重新顯示,則將調用onRestart()。

    No

    onStart() or onRestart()

     

    onStart()

    當activity對用戶即將可見的時候調用。

    其後調用onRestart()或onResume()(框架是否進行選擇性調用onResume()僅僅是猜測)

    No

    onRestart() or onResume()

    onRestart()

    當activity從停止狀態重新啟動時調用。其後調用onResume()。

    No

    onResume()

     

    onResume()

    當activity將要與用戶交互時調用此方法,此時activity在activity棧的棧頂,用戶輸入已經可以傳遞給它。

    如果其他的activity在它的上方恢復顯示,則將調用onFreeze()。

    No

    onFreeze()

    onFreeze()

    當你的activity被暫停而其他的activity恢復與用戶交互的時候這個方法會被調用(在其他activity顯示之前),你可以使用這個方法保存你當前的用戶狀態(一般來說是當前實例的用戶狀態)。暫停之後,為了回收資源供給前景activity,系統會在需要的時間停止(或者kill)你的應用。以後如果你的activity啟動一個新的實例重新與用戶進行交互,你保存在這裡的狀態都將通過onCreate()方法傳遞給新的實例。

    其後總是調用onPause()方法。

    No

    onPause()

    onPause()

    當系統要啟動一個其他的activity時調用(其他的activity顯示之前),這個方法被用來提交那些持久數據的改變、停止動畫、和其他占用CPU資源的東西。由於下一個activity在這個方法返回之前不會resumed,所以實現這個方法時代碼執行要盡可能快。

    如果activity重新回到前景時將調用onResume(), 如果對用戶徹底不可見則會調用onStop()。

    Yes

    onResume() or
    onStop()

    onStop()

    當另外一個activity恢復並遮蓋住此activity,導致其對用戶不再可見時調用。一個新activity啟動、其它activity被切換至前景、當前activity被銷毀時都會發生這種場景。

    當activity重新回到前景與用戶交互時調用onRestart(),如果activity將退出則調用onDestory()。

    Yes

    onStart() or
    onDestroy()

    onDestroy()

    在你的activity被銷毀前所調用的最後一個方法,當進程終止時會出現這種情況(對activity直接調用finish()方法或者系統為了節省空間而臨時銷毀此activity的實例,你可以通過isFinishing()的返回值來區分這兩種情況)。

    Yes

    nothing

     

    ①: 這個表格本人覺得還有些值得商榷的地方,建議作為參考閱讀,不管是原文還是譯文。

     

    注意上表中“Killable”這一列 —— 對於那些標記killable的方法,當這些方法結束後,activity的進程可能在任何時間被系統kill而不再執行activity中的任何代碼。因此你應該利用onFreeze()(保存你當前UI的狀態)和onPause()(將所有的修改寫回持久存儲),這樣activity才能在被kill的時候正確的保存當前的狀態。如果需要了解一個進程的生命周期與他所執行的activity之間的關系 參見 進程生命周期 部分。

     

    對於那些標記killable的方法,從這些方法啟動開始直到返回之前,activity的進程都不回被系統kill。舉個例子,一個activity在onPause()方法返回後處於killable的狀態,這種狀態會一直持續到onResume()方法開始執行。

     

    配置改變

    如果設備的配置(在Resources.Configuration中進行了定義)發生改變,那麼所有用戶界面上的東西都需要進行更新,以適應新的配置。因為Activity是與用戶交互的最主要的機制,它包含了處理配置改變的專門支持。

     

    除非你特殊指定,否則當配置發生改變(比如屏幕方向、語言、輸入設備等等的改變)時你當前的activity都將被銷毀,這銷毀是通過一個正常的activity生命周期過程(onFreeze(Bundle), onPause(), onStop(), 和 onDestroy())進行的。如果activity之前正在前景畫面,當這個實例的onDestroy()調用完成後將會啟動這個activity的一個新的實例,並將前面那個實例中onFreeze(Bundle)所保存的內容傳遞給新的實例。

     

    因為任何的應用資源(包括layout文件)都有可能由於任何配置值而改變。因此處理配置改變的唯一安全的方法就是重新獲取所有的資源,包括layout、繪圖資源(原文drawables)、字符串資源。由於activity已經如何保存自己的狀態並從這些狀態中重建自身,所以activity重新啟動自身來獲得新的配置將是一個非常便利的途徑。

     

    在一些特殊的情況中,你可能希望當一種或者多種配置改變時避免重新啟動你的activity。你可以通過在manifest中設置android:configChanges屬性來實現這點。你可以在這裡聲明activity可以處理的任何配置改變,當這些配置改變時不會重新啟動activity,而會調用activity的onConfigurationChanged(Resources.Configuration)方法。如果改變的配置中包含了你所無法處理的配置(在android:configChanges並未聲明),你的activity仍然要被重新啟動,而onConfigurationChanged(Resources.Configuration)將不會被調用。

     

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved