注:本文翻譯自Google官方的Android Developers Training文檔,譯者技術一般,由于喜愛安卓而產(chǎn)生了翻譯的念頭,純屬個人興趣愛好。
原文鏈接: http://developer.android.com/training/basics/activity-lifecycle/starting.html
不像其他的編程范例一樣應用的函數(shù)入口是“ main() ”方法,Android根據(jù)Activity處于何種聲明周期狀態(tài)去調用它所對應的生命周期回調函數(shù),以此來創(chuàng)建一個Activity實例。有一系列的生命周期函數(shù)用來啟動一個Activity,與之對應的,也有一系列生命周期函數(shù)來銷毀一個Activity。
這堂課將概要地講解一些最重要的生命周期函數(shù),然后向你展示如何處理第一個生命周期回調函數(shù),這個函數(shù)用來創(chuàng)建一個Activity的實例。
?
?一). 理解生命周期回調函數(shù)
在一個Activity的聲明周期中,系統(tǒng)會調用一系列聲明周期函數(shù),就像是一個金字塔階梯一樣向上爬行。每一個聲明階段都是金字塔上的一個臺階。當系統(tǒng)創(chuàng)建了一個新的Activity實例,每個聲明周期函數(shù)將Activity的狀態(tài)向上移動一個階段。在金字塔的頂端所對應的狀態(tài)是Activity已經(jīng)在前臺同時獲得了用戶焦點。
當用戶要離開這個Activity,系統(tǒng)會調用其他生命周期函數(shù)(延金字塔下行)以次來銷毀Activity。在有些情況中,Activity會只下行一部分,然后等待(比如用戶切換到了其他應用),之后Activity可以從這個狀態(tài)再回到頂端(如果用戶重新回到Activity),并且恢復到用戶離開時的狀態(tài)
圖1. 一個關于Activity生命周期的簡單描繪,我們用階梯狀金字塔來解釋它,這個圖展示了每個回調函數(shù)都會轉移Activity的狀態(tài)
根據(jù)你的Activity的復雜度,你可能不需要實現(xiàn)所有的聲明周期函數(shù)。然而,你務必要理解每一個生命周期函數(shù),并且在開發(fā)過程中,實現(xiàn)那些可以讓你的應用表現(xiàn)出用戶期望狀態(tài)的那些函數(shù)。實現(xiàn)你的Activity生命周期函數(shù)可以在多個方面讓你的應用表現(xiàn)出色,包括:
- 不會因為用戶切換到另一個應用或者接了一個電話而崩潰
- 不會在用戶不使用它時消耗太多系統(tǒng)資源
- 不會在用戶離開應用再返回時,丟失使用進度
- 不會在用戶切換屏幕方向時崩潰或丟失使用進度
隨著你進一步學習,會有多種如圖1中顯示的Activity狀態(tài)切換的情況。然而,只有這些狀態(tài)中的3個是靜態(tài)的。即,在一段時間內(非瞬時)Activity只能處于這三個狀態(tài)中的一個。
恢復態(tài)(Resumed)
在這個狀態(tài),Activity在前臺,并且用戶可以和它交互(獲得用戶焦點),有些時候也稱之為“運行態(tài)”
暫停態(tài)(Paused)
在這個狀態(tài),Activity有一部分被另一個Activity遮擋,也就是說,在前臺的這個Activity是半透明的,或者是沒有充滿整個屏幕的。當Activity處于這個狀態(tài)時,它不能接收用戶的輸入也不能執(zhí)行任何代碼。
停止態(tài)(Stopped)
在這個狀態(tài),Activity被完全地隱藏,無法被用戶看見,也可以理解為處于后臺。當處于停止態(tài)時,Activity的實例以及它的狀態(tài)信息,(如:成員變量)會被保留,這樣就能馬上使Activity轉移到恢復態(tài)。
?
?二). 指定你的啟動Activity
當用戶在主頁面點擊了你的應用圖標,系統(tǒng)會調用你在應用中聲明的啟動(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工具創(chuàng)建了一個新的Android項目工程,默認的項目文件會包含一個Activity,且它已在清單文件中擁有上述過濾器(filter)標簽聲明。
如果在你的Activity中, MAIN 行為或者 LAUNCHER 類別任何一個沒有聲明,那么你的應用圖標將不會在系統(tǒng)的主頁面應用圖標列表中出現(xiàn)。
?
三). 創(chuàng)建一個新的實例
大多數(shù)應用包含一些不同的Activity來讓用戶進行不同的操作。無論這個Activity是當用戶點擊應用圖標時所啟動的Activity,還是應用在對用戶操作進行響應時啟動的另一個Activity,系統(tǒng)通過調用 onCreate() 方法來創(chuàng)建每一個Activity實例。
你必須實現(xiàn) onCreate() 方法來表現(xiàn)出基本的應用啟動邏輯,這在該Activity整個生命周期中只發(fā)生一次。例如:你實現(xiàn)的 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 這種方法可以避免老版本系統(tǒng)執(zhí)行較新的API,但這種方法只適用于Android 2.0(API LEvel 5)及以上。比這再之前的系統(tǒng)會遇到一個運行時錯誤。
一旦 onCreate() 方法完成了執(zhí)行,系統(tǒng)會緊接著調用 onStart() 和 onResume() 方法。你的Activity永遠不會停留在創(chuàng)建態(tài)(Created)或啟動態(tài)(Started)。從技術上說,當 onStart() 方法被調用后,activity對用戶變成可見的,但是 onResume() 方法緊跟著執(zhí)行,然后activity保持在恢復態(tài)(Resumed)直到某些事件發(fā)生改變了它,比如當有一個電話打來,或這個用戶到了另一個activity,或者這個屏幕關閉了。
在后續(xù)的課程中,你將會看到其它用于啟動的方法( onStart() 和 onResume() 方法 ),在你的activity生命周期中是非常重要的,尤其在當activity處于暫停態(tài)或停止態(tài)時被調用用來恢復activity。
Note:
onCreate() 方法包括一個叫做“ savedInstanceState ”的參數(shù),在后續(xù)課程( Recreating an Activity )將會對其討論。
圖2. 圖中方框包括當創(chuàng)建一個新的activity實例時的三個回調方法:
onCreate()
,
onStart()
和
onResume()
。
一旦這一系列回調函數(shù)執(zhí)行完畢,activity到達了恢復態(tài),用戶可與其交互,直到用戶切換到了另一個activity。
?
四). 銷毀Activity
Activity生命周期的第一個回調函數(shù)是 onCreate() ,最后一個回調函數(shù)式 onDestroy() 。當系統(tǒng)為activity調用這個方法后,就意味著activity實例從RAM中徹底被移除。
大多數(shù)應用不需要實現(xiàn)這個方法,因為本地類引用會隨著activity被銷毀,并且你的activity會在 onPause() 方法和 onStop() 方法中執(zhí)行大多數(shù)的清除工作。然而,如果你的activity包含有在 onCreate() 中創(chuàng)建的后臺線程,或者其他會長時間運行的資源,不實現(xiàn) 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:
系統(tǒng)會在 onPause() 和 onStop() 方法執(zhí)行后調用
onDestroy() 方法。有一個情況例外:當你在
onCreate() 方法中調用 finish() 方法。有一些這樣的例子:比如當你的 activity 是一個零時的決策者,用來決定要啟動哪一個 activity 。你可能會在 onCreate() 方法中調用 finish() 方法。在這種情況下,系統(tǒng)會馬上調用 onDestroy() 方法,而不會調用任何其他的生命周期函數(shù)。
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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