注:本文翻譯自Google官方的Android Developers Training文檔,譯者技術一般,由于喜愛安卓而產生了翻譯的念頭,純屬個人興趣愛好。
原文鏈接: http://developer.android.com/training/basics/activity-lifecycle/starting.html
不像其他的編程范例一樣應用的函數入口是“ main() ”方法,Android根據Activity處于何種聲明周期狀態去調用它所對應的生命周期回調函數,以此來創建一個Activity實例。有一系列的生命周期函數用來啟動一個Activity,與之對應的,也有一系列生命周期函數來銷毀一個Activity。
這堂課將概要地講解一些最重要的生命周期函數,然后向你展示如何處理第一個生命周期回調函數,這個函數用來創建一個Activity的實例。
?
?一). 理解生命周期回調函數
在一個Activity的聲明周期中,系統會調用一系列聲明周期函數,就像是一個金字塔階梯一樣向上爬行。每一個聲明階段都是金字塔上的一個臺階。當系統創建了一個新的Activity實例,每個聲明周期函數將Activity的狀態向上移動一個階段。在金字塔的頂端所對應的狀態是Activity已經在前臺同時獲得了用戶焦點。
當用戶要離開這個Activity,系統會調用其他生命周期函數(延金字塔下行)以次來銷毀Activity。在有些情況中,Activity會只下行一部分,然后等待(比如用戶切換到了其他應用),之后Activity可以從這個狀態再回到頂端(如果用戶重新回到Activity),并且恢復到用戶離開時的狀態
圖1. 一個關于Activity生命周期的簡單描繪,我們用階梯狀金字塔來解釋它,這個圖展示了每個回調函數都會轉移Activity的狀態
根據你的Activity的復雜度,你可能不需要實現所有的聲明周期函數。然而,你務必要理解每一個生命周期函數,并且在開發過程中,實現那些可以讓你的應用表現出用戶期望狀態的那些函數。實現你的Activity生命周期函數可以在多個方面讓你的應用表現出色,包括:
- 不會因為用戶切換到另一個應用或者接了一個電話而崩潰
- 不會在用戶不使用它時消耗太多系統資源
- 不會在用戶離開應用再返回時,丟失使用進度
- 不會在用戶切換屏幕方向時崩潰或丟失使用進度
隨著你進一步學習,會有多種如圖1中顯示的Activity狀態切換的情況。然而,只有這些狀態中的3個是靜態的。即,在一段時間內(非瞬時)Activity只能處于這三個狀態中的一個。
恢復態(Resumed)
在這個狀態,Activity在前臺,并且用戶可以和它交互(獲得用戶焦點),有些時候也稱之為“運行態”
暫停態(Paused)
在這個狀態,Activity有一部分被另一個Activity遮擋,也就是說,在前臺的這個Activity是半透明的,或者是沒有充滿整個屏幕的。當Activity處于這個狀態時,它不能接收用戶的輸入也不能執行任何代碼。
停止態(Stopped)
在這個狀態,Activity被完全地隱藏,無法被用戶看見,也可以理解為處于后臺。當處于停止態時,Activity的實例以及它的狀態信息,(如:成員變量)會被保留,這樣就能馬上使Activity轉移到恢復態。
?
?二). 指定你的啟動Activity
當用戶在主頁面點擊了你的應用圖標,系統會調用你在應用中聲明的啟動(launcher)Activity,(可理解為“main”)的 onCreate() 方法。這個Activity就是你的應用和用戶交互的主入口。
你可以在清單文件中定義哪個Activity作為入口Activity,
AndroidManifest.xml
文件在你的項目工程的根目錄下。
你的應用的入口Activity必須在清單文件中使用
<intent-filter>
標簽
來聲明,在標簽中,具有
MAIN
行為(action),和
LAUNCHER
類別(
category
),例如:
< activity android:name =".MainActivity" android:label ="@string/app_name" > < intent-filter > < action android:name ="android.intent.action.MAIN" /> < category android:name ="android.intent.category.LAUNCHER" /> </ intent-filter > </ activity >
Note:
當你使用Android SDK工具創建了一個新的Android項目工程,默認的項目文件會包含一個Activity,且它已在清單文件中擁有上述過濾器(filter)標簽聲明。
如果在你的Activity中, MAIN 行為或者 LAUNCHER 類別任何一個沒有聲明,那么你的應用圖標將不會在系統的主頁面應用圖標列表中出現。
?
三). 創建一個新的實例
大多數應用包含一些不同的Activity來讓用戶進行不同的操作。無論這個Activity是當用戶點擊應用圖標時所啟動的Activity,還是應用在對用戶操作進行響應時啟動的另一個Activity,系統通過調用 onCreate() 方法來創建每一個Activity實例。
你必須實現 onCreate() 方法來表現出基本的應用啟動邏輯,這在該Activity整個生命周期中只發生一次。例如:你實現的 onCreate() 方法定義了用戶接口,同時還可能實例化一些類作用域下的變量。
例如:下述例子中的 onCreate() 方法展示了一些activity基本設置的代碼,比如聲明用戶接口(在一個XML布局文件中定義),定義了成員變量,配置了一些UI。
TextView mTextView; // Member variable for text view in the layout @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); // Set the user interface layout for this Activity // The layout file is defined in the project res/layout/main_activity.xml file setContentView(R.layout.main_activity); // Initialize member TextView so we can manipulate it later mTextView = (TextView) findViewById(R.id.text_message); // Make sure we're running on Honeycomb or higher to use ActionBar APIs if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { // For the main activity, make sure the app icon in the action bar // does not behave as a button ActionBar actionBar = getActionBar(); actionBar.setHomeButtonEnabled( false ); } }
Caution:
使用 SDK_INT 這種方法可以避免老版本系統執行較新的API,但這種方法只適用于Android 2.0(API LEvel 5)及以上。比這再之前的系統會遇到一個運行時錯誤。
一旦 onCreate() 方法完成了執行,系統會緊接著調用 onStart() 和 onResume() 方法。你的Activity永遠不會停留在創建態(Created)或啟動態(Started)。從技術上說,當 onStart() 方法被調用后,activity對用戶變成可見的,但是 onResume() 方法緊跟著執行,然后activity保持在恢復態(Resumed)直到某些事件發生改變了它,比如當有一個電話打來,或這個用戶到了另一個activity,或者這個屏幕關閉了。
在后續的課程中,你將會看到其它用于啟動的方法( onStart() 和 onResume() 方法 ),在你的activity生命周期中是非常重要的,尤其在當activity處于暫停態或停止態時被調用用來恢復activity。
Note:
onCreate() 方法包括一個叫做“ savedInstanceState ”的參數,在后續課程( Recreating an Activity )將會對其討論。
圖2. 圖中方框包括當創建一個新的activity實例時的三個回調方法:
onCreate()
,
onStart()
和
onResume()
。
一旦這一系列回調函數執行完畢,activity到達了恢復態,用戶可與其交互,直到用戶切換到了另一個activity。
?
四). 銷毀Activity
Activity生命周期的第一個回調函數是 onCreate() ,最后一個回調函數式 onDestroy() 。當系統為activity調用這個方法后,就意味著activity實例從RAM中徹底被移除。
大多數應用不需要實現這個方法,因為本地類引用會隨著activity被銷毀,并且你的activity會在 onPause() 方法和 onStop() 方法中執行大多數的清除工作。然而,如果你的activity包含有在 onCreate() 中創建的后臺線程,或者其他會長時間運行的資源,不實現 onDestroy() 方法會導致內存泄露,所以你應該在 onDestroy() 中清除它們。
@Override public void onDestroy() { super .onDestroy(); // Always call the superclass // Stop method tracing that the activity started during onCreate() android.os.Debug.stopMethodTracing(); }
Note:
系統會在 onPause() 和 onStop() 方法執行后調用
onDestroy() 方法。有一個情況例外:當你在
onCreate() 方法中調用 finish() 方法。有一些這樣的例子:比如當你的 activity 是一個零時的決策者,用來決定要啟動哪一個 activity 。你可能會在 onCreate() 方法中調用 finish() 方法。在這種情況下,系統會馬上調用 onDestroy() 方法,而不會調用任何其他的生命周期函數。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
