Android官方开发文档Training系列课程中文版:管理Activity的生命周期之启动一个Activity
原文地址 : http://android.xsoftlab.net/training/basics/activity-lifecycle/index.html
導(dǎo)言
用戶(hù)通過(guò)導(dǎo)航退出或者返回應(yīng)用的時(shí)候,應(yīng)用中Activity的生命周期會(huì)在不同的狀態(tài)之間變換。舉個(gè)例子,當(dāng)Activity初次啟動(dòng)的時(shí)候,它會(huì)來(lái)到系統(tǒng)的前面,然后得到用戶(hù)焦點(diǎn)。在這個(gè)過(guò)程中,Android系統(tǒng)會(huì)調(diào)用Activity的一系列生命周期函數(shù)。如果用戶(hù)執(zhí)行了啟動(dòng)另一個(gè)Activity的動(dòng)作或是轉(zhuǎn)換到其它APP上了,Android則會(huì)調(diào)用另一部分的生命周期函數(shù),看起來(lái)就像是進(jìn)入了后臺(tái)(雖然現(xiàn)在這個(gè)Activity是完全不可見(jiàn)狀態(tài)的,但是它的狀態(tài)還是會(huì)被完整的保存著)。
在生命周期回調(diào)函數(shù)中,你可以在用戶(hù)離開(kāi)或者重新進(jìn)入Activity時(shí)定義Activity的行為。舉個(gè)例子,如果你正在構(gòu)建一個(gè)流媒體播放器,當(dāng)用戶(hù)轉(zhuǎn)換到其它APP時(shí)你可能希望暫停視頻播放并暫停網(wǎng)絡(luò)連接,當(dāng)用戶(hù)又返回當(dāng)前的Activity時(shí),你希望重新建立網(wǎng)絡(luò)連接并在原來(lái)的位置繼續(xù)播放視頻。
這節(jié)課介紹了每個(gè)Activity實(shí)例的重要生命周期回調(diào)函數(shù)的回調(diào)及如何使用它們。所以當(dāng)Activity不再使用它們的時(shí)候,Activity需要釋放那些不再會(huì)重新使用的資源,就像用戶(hù)所期待的那樣。
啟動(dòng)一個(gè)Activity
不像其他程序一樣,App并不是從main()函數(shù)啟動(dòng)的。Android系統(tǒng)在Activity的實(shí)例中通過(guò)調(diào)用指定的回調(diào)函數(shù)進(jìn)行啟動(dòng)。這樣可以確保它們的生命周期狀態(tài)保持一致。Activity啟動(dòng)的時(shí)候有一列按順序執(zhí)行的回調(diào)函數(shù),在終結(jié)的時(shí)候也有一列的按順序執(zhí)行的回調(diào)函數(shù)。
這節(jié)課提供了大多數(shù)的生命周期函數(shù)概要,以及展示在創(chuàng)建一個(gè)新的Activity實(shí)例時(shí)如何處理第一個(gè)生命周期函數(shù)。
了解生命周期函數(shù)
在Activity的生命中,系統(tǒng)會(huì)按順序調(diào)用核心的生命周期函數(shù)集,類(lèi)似一個(gè)階梯狀的金字塔。正因?yàn)檫@樣,Activity的每一個(gè)生命周期狀態(tài)在這個(gè)過(guò)程都是單獨(dú)分開(kāi)的。當(dāng)系統(tǒng)創(chuàng)建了一個(gè)新的Activity實(shí)例,每一個(gè)回調(diào)函數(shù)都會(huì)移動(dòng)Activity的狀態(tài)到前一個(gè)的頂部。那么在最頂部的狀態(tài)便是Activity運(yùn)行在前臺(tái)的狀態(tài),并且用戶(hù)可以直接與它交互。
如果用戶(hù)開(kāi)始離開(kāi)這個(gè)Activity,系統(tǒng)會(huì)調(diào)用其它函數(shù)來(lái)移除剛才的每一個(gè)狀態(tài),以便逐漸銷(xiāo)毀這個(gè)Activity。在一些例子中,Activity的狀態(tài)會(huì)移除一部分然后等待(比如用戶(hù)將其它APP切換到了前面),等待到activity的狀態(tài)再一次回到頂部(用戶(hù)回到了這個(gè)Activity),恢復(fù)用戶(hù)離開(kāi)時(shí)的狀態(tài)。下圖是簡(jiǎn)單的生命周期說(shuō)明示意圖:
因?yàn)锳ctivity非常復(fù)雜,你可能沒(méi)有必要實(shí)現(xiàn)所有的生命周期函數(shù)。然而,懂得每一個(gè)生命周期函數(shù)是很重要的,確??梢酝ㄟ^(guò)它們的實(shí)現(xiàn)用戶(hù)所期待的行為方式??赡苡袔追N方式可以通過(guò)實(shí)現(xiàn)生命周期函數(shù)保證APP有良好的行為習(xí)慣,包括以下:
- 當(dāng)在使用APP時(shí)用戶(hù)接到電話(huà)或者轉(zhuǎn)到別的APP上時(shí)確保不要崩潰。
- 當(dāng)用戶(hù)不再使用部分資源的時(shí)候,請(qǐng)及時(shí)釋放它。
- 當(dāng)用戶(hù)離開(kāi)APP然后又返回APP時(shí)不要丟失用戶(hù)的進(jìn)度,比如輸入的文字和看到的視頻位置。
- 當(dāng)屏幕在水平方向或垂直方向旋轉(zhuǎn)時(shí)不要丟失用戶(hù)進(jìn)度更不要崩潰。
你將會(huì)學(xué)習(xí)接下來(lái)的課程,這里有一些上圖所展示的狀態(tài),然而,這里只列了3種狀態(tài),也就是說(shuō),在一個(gè)時(shí)期內(nèi),Activity只是在這3個(gè)狀態(tài)中的一個(gè)內(nèi)。
Resumed
在這個(gè)狀態(tài)下,activity位于前臺(tái),并且用戶(hù)可以直接與它交互。
Paused
在這個(gè)狀態(tài)下,activity被其它Activity掩蓋了一部分,其它Activity位于前臺(tái),并且是半透明狀或者是只掩蓋了一部分。在這個(gè)狀態(tài)下,activity不再接收用戶(hù)輸入,不能執(zhí)行任何代碼。
Stopped
在這個(gè)狀態(tài)下,activity完全被隱藏,對(duì)用戶(hù)完全不可見(jiàn)。這里考慮到它位于后臺(tái)。當(dāng)停止時(shí),activity的所有狀態(tài)信息比如成員變量都會(huì)被保留,但是不能再執(zhí)行任何代碼。
其它狀態(tài)(onCreate和onStart)是非常短暫的,系統(tǒng)通過(guò)調(diào)用下一個(gè)生命周期函數(shù)會(huì)非常順序的從這個(gè)狀態(tài)移動(dòng)到下一個(gè)狀態(tài)。所以,在在系統(tǒng)調(diào)用了onCreate()方法只會(huì)很快的調(diào)用onStart(),然后緊接著就是onResume().
這就是最基本的生命周期?,F(xiàn)在你將會(huì)學(xué)習(xí)一些特殊的生命周期行為。
指定App的啟動(dòng)Activity
當(dāng)用戶(hù)在主屏幕上點(diǎn)擊了你應(yīng)用的圖標(biāo),系統(tǒng)會(huì)啟動(dòng)應(yīng)用內(nèi)聲明了”launcher”的Activity,并調(diào)用該Activity的onCreate方法。這個(gè)Activity就是APP呈現(xiàn)給用戶(hù)的主入口界面。
你可以在Android的清單文件中聲明哪一個(gè)Activity是APP的主入口界面,AndroidManifest.xml位于工程的根目錄內(nèi)。
APP的主Activity必須在清單文件中以標(biāo)簽< intent-filter>聲明,并且需要包含MAIN行為以及LAUNCHER類(lèi)別:
<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:當(dāng)你使用Android SDK工具創(chuàng)建了一個(gè)新的Android工程時(shí),這個(gè)默認(rèn)的工程會(huì)在清單文件中包含一個(gè)以這種過(guò)濾聲明的Activity。
如果MAIN行為或者LAUNCHER類(lèi)別沒(méi)有在應(yīng)用的其中一個(gè)Activity聲明的話(huà),那么APP的圖標(biāo)將不會(huì)出現(xiàn)在設(shè)備的主屏幕應(yīng)用列表上。
創(chuàng)建一個(gè)新的實(shí)例
很多APP會(huì)包含好幾個(gè)不同的Activity以便讓用戶(hù)執(zhí)行不同的行動(dòng)。當(dāng)用戶(hù)點(diǎn)擊了APP的啟動(dòng)圖標(biāo)創(chuàng)建了一個(gè)主Activity或者是在APP內(nèi)點(diǎn)擊響應(yīng)按鈕啟動(dòng)了別的Activity,系統(tǒng)會(huì)通過(guò)調(diào)用onCreate方法創(chuàng)建每一個(gè)Activity的實(shí)例。
你必須實(shí)現(xiàn)onCreate方法來(lái)執(zhí)行一個(gè)最基本的應(yīng)用啟動(dòng)邏輯,并且應(yīng)該在Activity的整個(gè)生命周期中只執(zhí)行一次。舉個(gè)例子,你實(shí)現(xiàn)的onCreate()方法應(yīng)該定義用戶(hù)界面以及可能要初始化一些類(lèi)相關(guān)變量。
舉個(gè)例子,下面的這個(gè)onCreate的例子展示了一些代碼來(lái)執(zhí)行一些基礎(chǔ)的設(shè)置,比如聲明用戶(hù)界面,定義一些成員變量,然后配置一些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 filesetContentView(R.layout.main_activity);// Initialize member TextView so we can manipulate it latermTextView = (TextView) findViewById(R.id.text_message);// Make sure we're running on Honeycomb or higher to use ActionBar APIsif (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 buttonActionBar actionBar = getActionBar();actionBar.setHomeButtonEnabled(false);} }Caution:使用SDK_INT預(yù)防一些舊的系統(tǒng)運(yùn)行新的API,這樣的話(huà),老系統(tǒng)會(huì)發(fā)生運(yùn)行時(shí)錯(cuò)誤。
onCreate()方法一旦執(zhí)行完畢,系統(tǒng)會(huì)很快的調(diào)用onStart和onResume方法。你的系統(tǒng)絕不會(huì)駐留在Created狀態(tài)和Started狀態(tài)。從技術(shù)上將,當(dāng)onStart方法被調(diào)用后activity就變得可見(jiàn),但是onResume方法會(huì)很快的跟著調(diào)用,并保持在Resumed狀態(tài),直到一些事件將它改變,比如當(dāng)接到電話(huà),用戶(hù)轉(zhuǎn)換到了別的APP上,又或者設(shè)備的屏幕關(guān)閉了。
在下面的其它課程中,你將會(huì)見(jiàn)到如何啟動(dòng)其它方法,當(dāng)activity從Paused或者Stopped狀態(tài)恢復(fù)到Resumed狀態(tài)時(shí),onStart方法和onResume方法在Activity的生命周期中是非常有用的。
Note: onCreate方法會(huì)包含一個(gè)名叫savedInstanceState的參數(shù),我們稍后會(huì)在有關(guān)Recreating an Activity的課程中討論。
銷(xiāo)毀Activity
activity的第一個(gè)生命周期函數(shù)是onCreate,那么它的最后一個(gè)生命周期便是onDestory了。當(dāng)系統(tǒng)接收到終止信號(hào)的時(shí)候,將會(huì)調(diào)用這個(gè)方法,然后將activity完成的從系統(tǒng)內(nèi)存中移除。
大多數(shù)的APP不需要實(shí)現(xiàn)這個(gè)方法,因?yàn)楸镜仡?lèi)引用會(huì)隨著Activity一起總結(jié),不過(guò)Activity的清理工作應(yīng)該放在onPause下或者onStop下。然而,不過(guò)當(dāng)你在onCreate中啟動(dòng)了一個(gè)后臺(tái)線(xiàn)程或者其它長(zhǎng)時(shí)間運(yùn)行的資源,這時(shí)如果不適當(dāng)?shù)那謇韮?nèi)存的話(huà),可能會(huì)造成內(nèi)存泄露,你應(yīng)該在onDestory中殺死或者關(guān)閉它們。
@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)調(diào)用onDestory方法之后已經(jīng)調(diào)用過(guò)onPause方法與onStop方法,不過(guò)有一個(gè)例外情況:你在onCreate方法中調(diào)用了finish方法。在一些例子中,當(dāng)你的Activity臨時(shí)決定要啟動(dòng)另一個(gè)Activity,你可能要在onCreate方法內(nèi)調(diào)用finish方法來(lái)銷(xiāo)毀這個(gè)Activity,在這種情況下,系統(tǒng)會(huì)立即調(diào)用onDestory方法,而不會(huì)調(diào)用其它任何生命周期方法。
總結(jié)
以上是生活随笔為你收集整理的Android官方开发文档Training系列课程中文版:管理Activity的生命周期之启动一个Activity的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: RemoveError: ‘setupt
- 下一篇: Android远程服务与本地服务的特点以