此章節(jié)參考Android官網(wǎng)內(nèi)容而編寫,如有遺漏决采,后面會慢慢補(bǔ)上自沧。
一、Activity是什么?
Activity是android的一個應(yīng)用組件拇厢,是用戶與應(yīng)用交互的活動窗口爱谁。一個應(yīng)用由若干個Activity組成,每個Activity之間有或多或少的聯(lián)系孝偎。
一般指定某個Activity作為應(yīng)用的主Activity访敌,應(yīng)用啟動的時候會先顯示主Activity。而每個Activity都可以啟動其他的Activity衣盾。
二寺旺、創(chuàng)建Activity
創(chuàng)建Activity,必須創(chuàng)建Activity的子類(或使用其現(xiàn)有的子類)势决,需要在Acitivty的各個生命周期中調(diào)用回調(diào)方法阻塑。其中,最重要的兩個回調(diào)方法是:
onCreate():必須實(shí)現(xiàn)此方法徽龟。系統(tǒng)會在創(chuàng)建您的 Activity 時調(diào)用此方法叮姑。您應(yīng)該在實(shí)現(xiàn)內(nèi)初始化 Activity 的必需組件。 最重要的是据悔,您必須在此方法內(nèi)調(diào)用setContentView传透,以定義 Activity 用戶界面的布局。
onPause():系統(tǒng)將此方法作為用戶離開 Activity 的第一個信號(但并不總是意味著 Activity 會被銷毀)進(jìn)行調(diào)用极颓。 您通常應(yīng)該在此方法內(nèi)確認(rèn)在當(dāng)前用戶會話結(jié)束后仍然有效的任何更改(因?yàn)橛脩艨赡懿粫祷卮私缑妫?/p>
為了保證用戶體驗(yàn)的流暢度朱盐,還需要在其他的生命周期回調(diào)函數(shù)中,寫上處理邏輯菠隆。
在清單文件中聲明 Activity:
在清單文件中兵琳,將<activity>添加到<application>的子項(xiàng)中。
下面列舉<activity>節(jié)點(diǎn)的屬性骇径,并對部分做詳細(xì)說明:
1.android:allowTaskReparenting? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.android:alwaysRetainTaskState? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3.android:clearTaskOnLaunch? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4.android:configChanges
在某些設(shè)備配置(比如屏幕方向躯肌,字體大小,網(wǎng)絡(luò)類型等)發(fā)生變化的時候破衔,Activity將會被重新啟動以適配新的配置清女,這是系統(tǒng)行為。而Android同樣為應(yīng)用程序提供了一個阻止這種行為發(fā)生的手段晰筛,如果你不想因?yàn)槟撤N配置變化而發(fā)生Activity重啟嫡丙,則可以通過配置這個屬性并選擇你想要阻止的配置。如果你配置完畢并選擇了你關(guān)注的配置读第,則當(dāng)這些配置發(fā)生改變的時候Activity不會重啟曙博,而是通過onConfigurationChanged()回調(diào)方法通知應(yīng)用程序這些配置發(fā)生了變化。
5.android:enabled
6.android:excludeFromRecents
7.android:exported
8.android:finishOnTaskLaunch
9.android:hardwareAccelerated
該屬性是指是否應(yīng)為該Activity啟動硬件加速怜瞒,如果應(yīng)啟動父泳,則為true,否則為false。默認(rèn)值是false尘吗。
注意:不是所有的OpenGL 2D操作都會被加速逝她。如果啟用硬件加速渲染器,則要測試你的應(yīng)用程序以便確保它能使用渲染器而不會產(chǎn)生錯誤睬捶。
10.android:icon
11.android:label
12.android:launchMode
這個屬性描述了該Activity應(yīng)該如何被啟動。在Intent對象中近刘,與Activity標(biāo)志一起工作的模式有4種擒贸,分別是:standard,singleTop,singleTask和singleInstance。默認(rèn)模式是standard觉渴。
13.android:multiprocess
14.android:name
15.android:noHistory
16.android:permission
17.android:process
18.android:screenOrientation
該屬性表示Activity顯示的方向(比如縱向介劫,橫向)。
19.android:stateNotNeeded
20.android:taskAffinity
21.android:theme
22.android:windowSoftInputMode
該屬性表示Activity的主窗口如何與包含屏幕軟鍵盤的窗口交互案淋。設(shè)置該屬性將影響兩件事座韵。
①軟鍵盤的狀態(tài)。當(dāng)Activity獲取輸入焦點(diǎn)時踢京,是否隱藏軟鍵盤誉碴。
②對Activity主窗口的調(diào)整。該窗口是否被調(diào)整得更小一些來為軟鍵盤騰出空間瓣距,或者它的內(nèi)容是否被移動以便在部分窗口被軟鍵盤覆蓋時黔帕,使得當(dāng)前焦點(diǎn)可見。
使用 Intent 過濾器:
<activity>元素還可指定各種 Intent 過濾器—使用<intent-filter>元素—以聲明其他應(yīng)用組件激活它的方法蹈丸。
三成黄、啟動Activity
startActivity():
您可以通過調(diào)用startActivity(),并將其傳遞給描述您想啟動的 Activity 的Intent來啟動另一個 Activity.逻杖。
這里不僅可以啟動應(yīng)用內(nèi)的Activity奋岁,還能啟動其他應(yīng)用的Activity。
還可以調(diào)用系統(tǒng)的某些功能荸百,比如打電話闻伶,發(fā)郵件等。
startActivityForResult():
您可能需要從啟動的 Activity 獲得結(jié)果管搪。在這種情況下虾攻,請通過調(diào)用startActivityForResult()(而非startActivity())來啟動 Activity。 要想在隨后收到后續(xù) Activity 的結(jié)果更鲁,請實(shí)現(xiàn)onActivityResult()回調(diào)方法霎箍。 當(dāng)后續(xù) Activity 完成時,它會使用Intent向您的onActivityResult()方法返回結(jié)果澡为。
四漂坏、結(jié)束Activity
您可以通過調(diào)用 Activity 的finish()方法來結(jié)束該 Activity。您還可以通過調(diào)用finishActivity()結(jié)束您之前啟動的另一個 Activity。
五顶别、管理Activity生命周期
Activity基本上是以三種狀態(tài)存在:
運(yùn)行中:此 Activity 位于屏幕前臺并具有用戶焦點(diǎn)谷徙。
暫停:另一個 Activity 位于屏幕前臺并具有用戶焦點(diǎn),但此 Activity 仍可見驯绎。也就是說完慧,另一個 Activity 顯示在此 Activity 上方,并且該 Activity 部分透明或未覆蓋整個屏幕剩失。 暫停的 Activity 處于完全活動狀態(tài)(Activity對象保留在內(nèi)存中屈尼,它保留了所有狀態(tài)和成員信息,并與窗口管理器保持連接)拴孤,但在內(nèi)存極度不足的情況下脾歧,可能會被系統(tǒng)終止。
停止:該 Activity 被另一個 Activity 完全遮蓋(該 Activity 目前位于“后臺”)演熟。 已停止的 Activity 同樣仍處于活動狀態(tài)(Activity對象保留在內(nèi)存中鞭执,它保留了所有狀態(tài)和成員信息,但未與窗口管理器連接)芒粹。 不過兄纺,它對用戶不再可見,在他處需要內(nèi)存時可能會被系統(tǒng)終止是辕。
實(shí)現(xiàn)生命周期回調(diào)
onCreate(BundlesavedInstanceState):// The activity is being created.
onStart():// The activity is about to become visible.
onResume():// The activity has become visible (it is now "resumed").
onPause():// Another activity is taking focus (this activity is about to be "paused").
onStop():// The activity is no longer visible (it is now "stopped")
onDestroy():// The activity is about to be destroyed.
您在實(shí)現(xiàn)上面這些生命周期方法時必須始終先調(diào)用超類實(shí)現(xiàn)囤热,然后再執(zhí)行任何操作。
生命周期的三層嵌套:
整個生命周期:Activity 的整個生命周期發(fā)生在onCreate()調(diào)用與onDestroy()調(diào)用之間获三。您的 Activity 應(yīng)在onCreate()中執(zhí)行“全局”狀態(tài)設(shè)置(例如定義布局)旁蔼,并釋放onDestroy()中的所有其余資源。例如疙教,如果您的 Activity 有一個在后臺運(yùn)行的線程棺聊,用于從網(wǎng)絡(luò)上下載數(shù)據(jù),它可能會在onCreate()中創(chuàng)建該線程贞谓,然后在onDestroy()中停止該線程限佩。
可見生命周期:Activity 的可見生命周期發(fā)生在onStart()調(diào)用與onStop()調(diào)用之間。在這段時間裸弦,用戶可以在屏幕上看到 Activity 并與其交互祟同。 例如,當(dāng)一個新 Activity 啟動理疙,并且此 Activity 不再可見時晕城,系統(tǒng)會調(diào)用onStop()。您可以在調(diào)用這兩個方法之間保留向用戶顯示 Activity 所需的資源窖贤。 例如砖顷,您可以在onStart()中注冊一個BroadcastReceiver以監(jiān)控影響 UI 的變化贰锁,并在用戶無法再看到您顯示的內(nèi)容時在onStop()中將其取消注冊。在 Activity 的整個生命周期滤蝠,當(dāng) Activity 在對用戶可見和隱藏兩種狀態(tài)中交替變化時豌熄,系統(tǒng)可能會多次調(diào)用onStart()和onStop()。
前臺生命周期:Activity 的前臺生命周期發(fā)生在onResume()調(diào)用與onPause()調(diào)用之間物咳。在這段時間锣险,Activity 位于屏幕上的所有其他 Activity 之前,并具有用戶輸入焦點(diǎn)览闰。 Activity 可頻繁轉(zhuǎn)入和轉(zhuǎn)出前臺 — 例如囱持,當(dāng)設(shè)備轉(zhuǎn)入休眠狀態(tài)或出現(xiàn)對話框時,系統(tǒng)會調(diào)用onPause()焕济。 由于此狀態(tài)可能經(jīng)常發(fā)生轉(zhuǎn)變,因此這兩個方法中應(yīng)采用適度輕量級的代碼盔几,以避免因轉(zhuǎn)變速度慢而讓用戶等待晴弃。
下圖是完整的activity生命周期圖:
onCreate():首次創(chuàng)建 Activity 時調(diào)用。 您應(yīng)該在此方法中執(zhí)行所有正常的靜態(tài)設(shè)置 — 創(chuàng)建視圖逊拍、將數(shù)據(jù)綁定到列表等等上鞠。 系統(tǒng)向此方法傳遞一個 Bundle 對象,其中包含 Activity 的上一狀態(tài)芯丧,不過前提是捕獲了該狀態(tài)(請參閱后文的保存 Activity 狀態(tài))芍阎。始終后接onStart()。
onRestart():在 Activity 已停止并即將再次啟動前調(diào)用缨恒。始終后接onStart()谴咸。
onStart():在 Activity 即將對用戶可見之前調(diào)用。如果 Activity 轉(zhuǎn)入前臺骗露,則后接onResume()岭佳,如果 Activity 轉(zhuǎn)入隱藏狀態(tài),則后接onStop()萧锉。
onResume():在 Activity 即將開始與用戶進(jìn)行交互之前調(diào)用珊随。 此時,Activity 處于 Activity 堆棧的頂層,并具有用戶輸入焦點(diǎn)。始終后接onPause()提针。
onPause():當(dāng)系統(tǒng)即將開始繼續(xù)另一個 Activity 時調(diào)用岳颇。 此方法通常用于確認(rèn)對持久性數(shù)據(jù)的未保存更改、停止動畫以及其他可能消耗 CPU 的內(nèi)容粮彤,諸如此類。 它應(yīng)該非常迅速地執(zhí)行所需操作,因?yàn)樗祷睾蟛研觯乱粋€ Activity 才能繼續(xù)執(zhí)行不恭。
如果 Activity 返回前臺,則后接onResume()财饥,如果 Activity 轉(zhuǎn)入對用戶不可見狀態(tài)换吧,則后接onStop()。
onStop():在 Activity 對用戶不再可見時調(diào)用钥星。如果 Activity 被銷毀沾瓦,或另一個 Activity(一個現(xiàn)有 Activity 或新 Activity)繼續(xù)執(zhí)行并將其覆蓋,就可能發(fā)生這種情況谦炒。
如果 Activity 恢復(fù)與用戶的交互贯莺,則后接onRestart(),如果 Activity 被銷毀宁改,則后接onDestroy()缕探。
onDestroy():在 Activity 被銷毀前調(diào)用。這是 Activity 將收到的最后調(diào)用还蹲。 當(dāng) Activity 結(jié)束(有人對 Activity 調(diào)用了finish())爹耗,或系統(tǒng)為節(jié)省空間而暫時銷毀該 Activity 實(shí)例時,可能會調(diào)用它谜喊。 您可以通過isFinishing()方法區(qū)分這兩種情形潭兽。
保存 Activity 狀態(tài)
協(xié)調(diào) Activity