Activity定義
Activity是一種提供了螢幕並能讓使用者做一些互動的應用組件,就像撥號,拍照,寄送電子郵件或者瀏覽地圖,每一個activity被給與了用於繪製使用者介面的視窗,一般視窗都是充滿螢幕的,但可能比螢幕小一點並且浮在其他視窗之上。
一個應用通常由多個相互緊密聯絡的Activies組成,典型的一個activity在應用中被指定成“主”activity,使用者第一次運行應用所顯現的。為了能執行不同的行為每個activity可以運行另一個activity。每次一個新的Activity開啟,上一個activity被停止,系統保留activity在棧中(回退棧),當一個新activity運行,它被推入棧頂並讓使用者得到焦點。回退棧遵守“後進,先出”的棧機制,所以,當使用者在當前的activity上按了返回按鈕,它從棧頂彈出(被銷毀)並且上一個activity恢複到當前。
兩個重要的回調方法
onCreate()
在建立你的activity時,你必須實現這個方法,在這個實現體中,你應該初始化必要的組件,這裡也是你調用setContentView()方法來定義你介面布局的地方。
onPause()
系統調用此方法說明了使用者已經離開了你的activity(雖然不能總是理解為activity被銷毀),在這裡通常需要你提交任何變更來保留目前使用者的session(因為使用者可能不再回來)。
在manifest中聲明activity
你必須在manifest中聲明你的activity來關聯你的系統,開啟你的manifest檔案,添加一個<activity>元素作為<application>元素子項目。比如:
<manifest ... > <application ... > <activity android:name=".ExampleActivity" /> ... </application ... > ...</manifest >
在acitivity元素中你還可以包含其他幾個屬性,具體參考 <activity>
運行一個activity
你可以調用startActivity()來運行另一個activity,傳遞一個Intent來描述你想啟動並執行activity。
在你的應用程式中,你經常會運行一個已知的activity,你可以建立換一個intent來準確的定義你希望啟動並執行activity。比如:
Intent intent = new Intent(this, SignInActivity.class);startActivity(intent);
然而,你的應用程式可能也想執行一些action,比如發送一封郵件,文本資訊或者狀態更新,在這樣的情況,你的應用程式可能沒有自己的activities來執行這類actions。所以,你可以通過一些方法來運行其他應用已經提供的activities,這就是intent的真正價值所在。比如你想發送一封電子郵件,你可以建立如下intent。
Intent intent = new Intent(Intent.ACTION_SEND);intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);startActivity(intent);
運行一個有返回結果的activity
有時,你想要從你啟動並執行activity擷取結果。這樣的情況,調用startActivityForResult()來運行activity(而不是startActivity())。從後續的activity中擷取結果,實現onActivityResult()回調方法。當後續的activity完成操作,它返回一個結果在Intent中到你的onActivityResult()方法中。
View Code
private void pickContact() { // Create an intent to "pick" a contact, as defined by the content provider URI Intent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI); startActivityForResult(intent, PICK_CONTACT_REQUEST);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { // If the request went well (OK) and the request was PICK_CONTACT_REQUEST if (resultCode == Activity.RESULT_OK && requestCode == PICK_CONTACT_REQUEST) { // Perform a query to the contact's content provider for the contact's name Cursor cursor = getContentResolver().query(data.getData(), new String[] {Contacts.DISPLAY_NAME}, null, null, null); if (cursor.moveToFirst()) { // True if the cursor is not empty int columnIndex = cursor.getColumnIndex(Contacts.DISPLAY_NAME); String name = cursor.getString(columnIndex); // Do something with the selected contact's name... } }}
該執行個體展示了你應該在onActivityResult()中如何處理返回結果。第一種情況檢查了如果請求成功,那麼resultCode將是RESULT_OK,這裡,代碼通過在Intent中查詢activity返回的資料。
關閉一個activity
你可以通過調用finish()方法來關閉一個activity,你也可以通過調用finishActivity()方法來關閉你之前啟動並執行獨立activity。
管理activity生命週期
一個activity存在三個必要的狀態:
Resumed
activity在螢幕的前端並且並且擷取焦點。
Paused
另一個activity在前台並擷取焦點,但之前的activity依然可見。也就是,另外一個activity在某個activity之上並且那個activity部分透明或者沒有完全覆蓋整個螢幕。一個暫停activity是完全存活的(Activity對象被保留在記憶體中,維護所有的狀態和成員資訊,並且附屬於視窗管理),但是,在極低記憶體的情況下可以被系統殺掉。
Stopped
activity被另一個activity完全覆蓋(activity在“後台”)。一個停止的activity也是存活的(Activity對象被保留在記憶體中,維護所有的狀態和成員資訊,但不附屬於視窗管理),然而,它不再被使用者可見並且在系統需要記憶體時將被殺掉。
如果一個activity是暫停或者停止,系統都可以將記憶體中銷毀通過finish(調用finish()方法),或者殺掉它的進程。當activity再次開啟(在finished和killed之後),它必定完全被建立。
生命週期的回調方法
View Code
public class ExampleActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // The activity is being created. } @Override protected void onStart() { super.onStart(); // The activity is about to become visible. } @Override protected void onResume() { super.onResume(); // The activity has become visible (it is now "resumed"). } @Override protected void onPause() { super.onPause(); // Another activity is taking focus (this activity is about to be "paused"). } @Override protected void onStop() { super.onStop(); // The activity is no longer visible (it is now "stopped") } @Override protected void onDestroy() { super.onDestroy(); // The activity is about to be destroyed. }}
- 一個activity的整個生命週期發生在調用
onCreate()和onDestroy()之間,你的activity應該執行“全域”狀態的設立(setup of "global" state)(比如定義布局)在onCreate()中,釋放所有保留的資源在onDestroy()。
- 一個activity的可見生命週期發生在調用
onStart()和onStop()。在這個過程中,使用者可以在介面上看見activity並操作它。在這兩個方法之間,你可以保留那些需要在activity展現給使用者的資源。比如,你可以註冊一個BroadcastReceiver在
onStart()中去監聽影響你UI的變更,並且在onStop()中執行登出當使用者不再看見你所顯示的內容。系統可能會在整個生命週期中多次調用 onStart()和
onStop()方法,當activity在可見和隱藏這兩個狀態之間交替。
- 一個activity的前景生命週期發生在調用
onResume()和
onPause()之間,在這個過程中,activity在螢幕中其他所有activities前面並且有使用者輸入焦點。因為這個狀態可以經常傳遞,在這兩個方法中的代碼儘可能的輕量級為了能夠避免使用者等待。
展示了整個activity的生命週期。
Method |
Description |
Killable after? |
Next |
onCreate()
|
在activity第一次被建立時調用。這裡一般是你用來做配置的——建立視圖,綁定資料到列表中等等。這個方法被傳遞一個Bundle對象,它包含了上一次activity的狀態,如果狀態被捕獲(查看 Saving Activity State)。接下來總是會調用onStart()。 |
No |
onStart() |
|
onRestart()
|
activity已經被停止之後被調用,被再次運行。接下來總是會調用onStart()。 |
No |
onStart() |
onStart()
|
在activity對使用者可見之前被調用。接下來會調用onResume()如果activity在前景,或者onStop()acitvity被隱藏。 |
No |
onResume() or
onStop() |
|
onResume()
|
activity開始能和使用者進行互動之前被調用。在這點上activity在activity棧頂,使用者可以輸入。接下來總是會調用 onPause()。 |
No |
onPause() |
onPause()
|
當系統正開始恢複另一個activity時被調用。該方法通常使用者提交未儲存的變動來保持資料持久,停止可能消耗CPU的動畫和其他事情等等。無論什麼處理都應該非常快,因為下一個activity將恢複直到它返回。 接下來要麼調用onResume()如果activity返回到前面,或者onStop()如果它對使用者不可見。 |
Yes |
onResume() or
onStop() |
onStop()
|
當activity對使用者不再可見時被調用。可能發生在因為它被銷毀了,或者因為另一個activity(無論是存在的還是新的一個activity)已經被恢複並且覆蓋它。 接下來要麼調用onRestart()如果activity返回與使用者互動,或者調用 onDestroy()如果activity銷毀。 |
Yes |
onRestart() or
onDestroy() |
onDestroy()
|
在activity被銷毀前調用。這個是activity將會接收到的最後一個調用,它可以被調用要麼因為activity結束(調用了finish()),要麼因為系統臨時銷毀了activity的執行個體去釋放空間。你可以使用isFinishing()來區分這兩個情景。
|
Yes |
nothing |
這裡不保證onSaveInstanceState()會在你的activity銷毀前被調用,因為這裡有一種情況是沒有必要儲存狀態(比如使用者使用回退鍵離開你的activity,因為使用者明確想關閉該activity)。如果系統調用onSaveInstanceState(),它會在onStop()之前和可能在onPause()之前。
因為onSaveInstanceState()不保證會被調用,你應該使用它來儲存activity之間傳遞的狀態(UI狀態)——你應該永遠都不要使用它來儲存持久資料,相反的,你應該使用onPause()來儲存持久資料(比如將資料儲存到資料庫中)當使用者離開activity。
處理配置(configuration)變更
一些裝置配置在運行時可以改變(比如螢幕方向(orientation),鍵盤可用性,和語言)。當這樣的改變發生時,Android重新建立正在啟動並執行activity(系統調用 onDestroy(),然後立刻調用onCreate()
)。這個被設計的行為能夠協助你的應用程式通過你所提供的可選資源自動載入到你的應用程式中來達到程式適應新的配置(比如不同的布局針對不同的螢幕方向和尺寸)。更多資訊請查看 Handling Runtime Changes。
只是讓自己能看懂,如有意思表達不清楚,請指出。
原文:http://developer.android.com/guide/topics/fundamentals/activities.html